Communityコーディング&開発github.com

YarlisAISolutions/rules-cascade-java

JVM(Java 17+、Kotlin、Scala)上で Rule Cascade ルールを適用するスキル。Spring Boot、Quarkus、Micronaut、Jakarta EE に対応し、com.rulescascade:rules-cascade-core を使用してルールを JVM サービスに組み込み、Bean Validation や手書きチェックをエンジンに置き換え、ルールの結果を HTTP エラーにマッピングします。

rules-cascade-java とは?

このスキルは、JVM(Java 17+、Kotlin、Scala)上で Rule Cascade ルールを適用するためのエンジン統合を提供します。Spring Boot、Quarkus、Micronaut、Jakarta EE といった主要フレームワークをサポートし、`com.rulescascade:rules-cascade-core` 依存関係を追加するだけで使用可能です。ルールはビルド時に `rcas compile --all` でバンドル(JSON)にコンパイルされ、実行時には YAML を評価せずにバンドルを読み込んで評価します。 主な機能として、`rules.enforce(request)` メソッドで許可結果を返すか、違反時に `RuleViolationException` をスローします。この例外は `@RestControllerAdvice` で一元的にキャッチし、HTTP 422(ProblemDetail)としてレスポンスを返すことが推奨されています。また、`rcas analyze` コマンドを使って既存の Bean Validation や Drools、手書きチェックを分析し、段階的にルールに置き換えるためのパリティテスト支援も行います。 実際のコード例では、`RuleSet` インスタンスを起動時にバンドルから生成し、リクエストごとに評価を実行するパターンが示されています。アクター(操作者)はセキュリティコンテキストから取得し、呼び出し元が制御するヘッダーからは取得しないなどのセキュリティ考慮事項も含まれています。

対応~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 コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

JVM 上の Rule Cascade

依存関係(Maven): com.rulescascade:rules-cascade-core(Java 17+、その他のランタイム依存関係なし; パッケージ com.rulescascade)。Gradle: implementation("com.rulescascade:rules-cascade-core:<version>")。 バンドルは rcas compile --all によって build/rules/ に生成されます。実行時に YAML を評価したり、ルールをコードにコピーしたりしないでください。

一度ロードし、リクエストごとに評価

import com.rulescascade.*;

// 1 つの Bean / シングルトンとして、起動時に作成する。ここで例外が発生した場合はアプリケーションを停止させること。
RuleSet rules = RuleSet.fromBundle((Map<String, Object>) Json.parse(Files.readString(Path.of("build/rules/<ruleset-id>.bundle.json"))));
List<String> missing = rules.missingOperators();   // ルールが必要とするカスタム演算子
if (!missing.isEmpty()) throw new IllegalStateException("未登録の演算子: " + missing);

Jackson で JSON をパースする場合、DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS を有効にして、金額が正確にエンジンに渡るようにします。

rules.enforce(request) を使用することを推奨(1.0.0-alpha.7 以降): 許可された結果を返すか、com.rulescascade.RuleViolationException をスローします。この例外の problem() は 422 応答で、すべての Rule Cascade ランタイムで共通です。1 つのハンドラーですべてのエンドポイントに応答します:

@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());
    }
}

コントローラーメソッドにアノテーションを付ける場合は、Spring Boot の例(https://rulescascade.com/reference/examples/backend-spring-boot/)から @EnforceRules と RuleEnforcementAspect をコピーしてください; これには spring-boot-starter-aspectj が必要です(Spring Boot 4 より前は spring-boot-starter-aop)。すべての状態変更エンドポイントは次の 4 つの手順に従います:

  1. サーバー上で評価: rules.evaluate(EvaluationRequest.builder(entity, operation).data(data).original(original).actor(...).build(), Channel.SERVER) アクターはセキュリティコンテキストから取得し、呼び出し元が制御するヘッダーからは決して取得しません。
  2. 拒否時は拒否: !result.allowed() の場合、RuleViolationException(result) をスローし、@RestControllerAdvice / 例外マッパーで一度だけマッピングして、422 ProblemDetail(type: urn:rule-cascade:rule-violation と結果(result.toMap())をプロパティとして含む)にします。
  3. 永続化: compute 効果(effect.type() が value)を適用した後、サーバーの値を保存します。
  4. コミット後に result.commands() を実行:(@TransactionalEventListener(phase = AFTER_COMMIT) またはアウトボックスを使用)各 idempotencyKey に対して 1 回。

配置: Spring では @Configuration に RuleSet @Bean と、リクエストを構築するエンティティごとのサービス; Quarkus/Micronaut では @Singleton プロデューサー。Kotlin と Scala も同じ API を呼び出します。 RuleSetHolder は一定間隔または cron スケジュールでバンドルを再読み込みし、最後に有効だったルールを保持します。

既存のバリデーションの置き換え

rcas analyze --module <module> は、Bean Validation アノテーション、Spring Validator、@PreAuthorize、Drools .drl ルール、手書きチェック、名前付き制限(MAX_QUANTITY = 10)、数値との比較、ステータスに基づく switch 分岐をリストアップします。drift を持つ候補は、同じ名前がフロントエンドで別の値を持っていることを意味します: 1 つのルールセットが両方に対して決定する必要があります。必要に応じて、DTO に @NotNull/@Size 型チェックを残しても構いません; ビジネス上の決定はルールに移行してください。パリティテスト(古いチェックとエンジンの同じ入力に対する JUnit @ParameterizedTest)を追加し、その後古いチェックを削除します。

テスト

decision と検出コードをアサートし、メッセージテキストはアサートしないでください。ルールセット内のゴールデンテスト(rcas check)はルールをテストします; CI は mvn verify / gradle test の前に rcas check と rcas compile --all を実行します。

参考: https://rulescascade.com/usage/java/ および https://rulescascade.com/playbooks/backend-api/

Individual skills in this repo

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

関連スキル