Community程式設計與開發github.com

YarlisAISolutions/rules-cascade-java

在 JVM 上強制執行 Rule Cascade 規則 — 支援 Java 17+、Kotlin 與 Scala;Spring Boot、Quarkus、Micronaut、Jakarta EE — 使用 com.rulescascade:rules-cascade-core。在將規則整合到 JVM 服務、取代 Bean Validation 或手動檢查、或將規則結果映射到 HTTP 錯誤時使用。

rules-cascade-java 是什麼?

此技能為開發者提供在 JVM 應用程式中整合 Rule Cascade 規則引擎的完整指南。它支援 Java 17+、Kotlin 與 Scala 語言,並與 Spring Boot、Quarkus、Micronaut、Jakarta EE 等主流框架相容。核心依賴為 `com.rulescascade:rules-cascade-core`,可在 Maven 或 Gradle 專案中輕鬆加入。技能文件詳細說明如何從 YAML 編譯的 bundle 檔案載入規則、透過 `rules.enforce(request)` 或 `rules.evaluate(EvaluationRequest)` 評估請求、並將拒絕結果統一以 HTTP 422 狀態碼回應。此外,它也涵蓋取代現有驗證邏輯的策略(如 Bean Validation、Drools、手動檢查),並提供自動化分析工具 `rcas analyze` 輔助遷移。同時強調安全實踐,例如從安全上下文取得行為者、避免客戶端控制請求頭。最後,文件包含測試建議,如使用黃金測試與 `rcas check` 在 CI 中驗證規則。

相容平台~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 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

在 JVM 上使用 Rule Cascade

相依性(Maven):com.rulescascade:rules-cascade-core(Java 17+,無其他執行期相依性;套件 com.rulescascade)。Gradle:implementation("com.rulescascade:rules-cascade-core:<version>")。 Bundle 來自 rcas compile --all 並輸出至 build/rules/。切勿在執行期評估 YAML,也絕對不要將規則複製到程式碼中。

載入一次,每個請求評估一次

import com.rulescascade.*;

// 一個 Bean / Singleton,在啟動時建立。此處的例外必須中止應用程式。
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 執行期中相同。一個處理器即可處理所有端點:

@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)。每個改變狀態的端點遵循以下四個步驟:

  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) 或 outbox),每個 idempotencyKey 執行一次。

配置方式:Spring 使用 @Configuration 搭配 RuleSet @Bean 和一個為每個實體建立請求的服務;Quarkus/Micronaut 使用 @Singleton 生產者。Kotlin 與 Scala 呼叫相同的 API。RuleSetHolder 會依間隔或 cron 排程重新載入 bundle,並保留最後一組正確的規則。

取代現有驗證

rcas analyze --module <module> 會列出 Bean Validation 註解、Spring 驗證器與 @PreAuthorize、Drools .drl 規則、手動檢查、命名限制(MAX_QUANTITY = 10)、數字比較以及狀態上的 switch 分支。帶有 drift 的候選項表示相同名稱在前端有另一個值:必須由一個規則集為兩者決定。如果需要,可以保留 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.

相關技能