CommunityCodierung & Entwicklunggithub.com

YarlisAISolutions/rules-cascade-java

Erzwinge Rule-Cascade-Regeln auf der JVM – Java 17+, Kotlin und Scala; Spring Boot, Quarkus, Micronaut, Jakarta EE – mit com.rulescascade:rules-cascade-core. Verwende es, um Regeln in einen JVM-Dienst einzubinden, Bean-Validation oder handgeschriebene Prüfungen durch die Engine zu ersetzen oder Rule-Ergebnisse auf HTTP-Fehler abzubilden.

Was ist rules-cascade-java?

Diese Skill-Anleitung beschreibt, wie die Rule-Cascade-Engine auf der JVM (Java 17+, Kotlin, Scala) in Frameworks wie Spring Boot, Quarkus, Micronaut und Jakarta EE integriert wird. Sie erklärt die zentralen Schritte: einmaliges Laden eines Rule-Bundles beim Start, Bewertung pro Anfrage über `rules.enforce()` oder `rules.evaluate()`, einheitliche Fehlerbehandlung mit 422-ProblemDetail-Responses und die Umstellung von bestehenden Validierungen (Bean Validation, Spring Validatoren, Drools, handgeschriebene Checks). Die Anleitung zeigt konkrete Codebeispiele für die Konfiguration (Maven/Gradle), das Laden des Bundles, die Exception-Behandlung per `@RestControllerAdvice` sowie die vier Schritte für zustandsändernde Endpunkte (Server-Bewertung, Ablehnung bei Verweigerung, Persistierung mit `compute`-Effekten, Ausführung von `commands()` nach dem Commit). Außerdem enthält sie Hinweise zur Analyse vorhandener Validierungen mit `rcas analyze`, zu Paritätstests und zur Ausführung von `rcas check` und `rcas compile` in der CI.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/YarlisAISolutions/rule-cascade-skills/tree/main/plugins/rules-cascade/skills/rules-cascade-java

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Rule Cascade auf der JVM

Abhängigkeit (Maven): com.rulescascade:rules-cascade-core (Java 17+, keine weitere Laufzeitabhängigkeit; Paket com.rulescascade). Gradle: implementation("com.rulescascade:rules-cascade-core:<version>"). Bundles stammen aus rcas compile --all, abgelegt in build/rules/. Werte das YAML niemals zur Laufzeit aus und kopiere niemals eine Regel in den Code.

Einmal laden, pro Anfrage auswerten

import com.rulescascade.*;

// Ein Bean / Singleton, das beim Start erstellt wird. Eine Ausnahme hier muss die Anwendung stoppen.
RuleSet rules = RuleSet.fromBundle((Map<String, Object>) Json.parse(Files.readString(Path.of("build/rules/<ruleset-id>.bundle.json"))));
List<String> missing = rules.missingOperators();   // benutzerdefinierte Operatoren, die die Regeln benötigen
if (!missing.isEmpty()) throw new IllegalStateException("unregistered operators: " + missing);

Wenn der Dienst JSON mit Jackson parst, aktiviere DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, damit Beträge exakt in die Engine gelangen.

Bevorzuge rules.enforce(request) (seit 1.0.0-alpha.7): es gibt das erlaubte Ergebnis zurück oder wirft com.rulescascade.RuleViolationException, dessen problem() die 422-Antwort ist, die in jeder Rule-Cascade-Laufzeitumgebung gleich ist. Ein Handler beantwortet es für jeden Endpunkt:

@RestControllerAdvice
class RuleErrors {
    @ExceptionHandler(RuleViolationException.class)
    ResponseEntity<Map<String, Object>> denied(RuleViolationException e) {
        return ResponseEntity.status(e.status()).contentType(MediaType.APPLICATION_PROBLEM_JSON).body(e.problem());
    }
}

Für eine Annotation an Controller-Methoden kopiere @EnforceRules und RuleEnforcementAspect aus dem Spring-Boot-Beispiel (https://rulescascade.com/reference/examples/backend-spring-boot/); es benötigt spring-boot-starter-aspectj (spring-boot-starter-aop vor Spring Boot 4). Jeder zustandsändernde Endpunkt folgt vier Schritten:

  1. Auf dem Server auswerten: rules.evaluate(EvaluationRequest.builder(entity, operation).data(data).original(original).actor(...).build(), Channel.SERVER). Der Actor stammt aus dem Sicherheitskontext, niemals aus einem vom Aufrufer gesteuerten Header.
  2. Bei Verweigerung ablehnen: wenn !result.allowed(), wirf eine RuleViolationException(result) und bilde sie einmalig, in einem @RestControllerAdvice / Exception Mapper, auf eine 422 ProblemDetail mit type: urn:rule-cascade:rule-violation und dem Ergebnis (result.toMap()) als Eigenschaft ab.
  3. Persistieren, nach Anwendung der compute-Effekte (effect.type() ist value): der Serverwert wird gespeichert.
  4. result.commands() ausführen nach dem Commit (@TransactionalEventListener(phase = AFTER_COMMIT) oder einer Outbox), einmal pro idempotencyKey.

Platzierung: Spring eine @Configuration mit einem RuleSet @Bean und einem Dienst pro Entität, der die Anfrage aufbaut; Quarkus/Micronaut ein @Singleton-Producer. Kotlin und Scala rufen dieselbe API auf. RuleSetHolder lädt Bundles in einem Intervall oder nach einem Cron-Zeitplan neu und behält die letzte gültige Regeln.

Ersetzen vorhandener Validierungen

rcas analyze --module <module> listet Bean-Validation-Annotationen, Spring-Validatoren und @PreAuthorize, Drools .drl-Regeln, handgeschriebene Prüfungen, benannte Limits (MAX_QUANTITY = 10), Vergleiche mit Zahlen und switch-Zweige zu einem Status auf. Ein Kandidat mit drift bedeutet, dass derselbe Name im Frontend einen anderen Wert hat: Ein Regelsatz muss ihn für beide entscheiden. Behalte @NotNull/@Size-Typ- Prüfungen auf dem DTO, wenn du möchtest; verschiebe Geschäftsentscheidungen in Regeln. Füge einen Paritätstest hinzu (JUnit @ParameterizedTest über dieselben Eingaben für die alte Prüfung und die Engine) und lösche dann die alte Prüfung.

Tests

Behaupte decision und Finding-Codes, nicht Nachrichtentexte. Goldene Tests im Regelsatz (rcas check) testen die Regeln; CI führt rcas check und rcas compile --all vor mvn verify / gradle test aus.

Referenz: https://rulescascade.com/usage/java/ und https://rulescascade.com/playbooks/backend-api/

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Verwandte Skills