Drools7.37验证drl报Unable to resolve ObjectType 'getAmount'错误如何解决
问题原因
你在规则的条件分支(LHS,即when块)直接书写$amount: getAmount($user, "single")时,Drools会默认将getAmount识别为待匹配的事实对象(Fact)类型,而非函数调用,所以会抛出找不到对应ObjectType的异常:Drools LHS的默认语法结构是「变量名: 类型(约束条件)」的模式匹配结构,不会主动识别为函数调用逻辑。
解决方案
1. 调整DRL规则写法
根据你的使用场景选对应写法即可:
- 如果你需要在LHS对返回的金额做条件过滤,使用
from eval显式声明是函数调用并绑定返回值:
import com.myorg.model.UserAccount; import function com.myorg.utils.UserAccountHelper.getAmount; rule "Classification userC" when $user : UserAccount(_age < 50); // 显式调用函数并绑定返回值,括号内可加金额约束,比如 Double(this > 500) $amount: Double() from eval(getAmount($user, "single")); then $user.set_userClassification("userC"); end
- 如果你不需要在条件分支判断金额,直接把函数调用移到结果分支(RHS,即then块)即可,不需要修改LHS逻辑:
import com.myorg.model.UserAccount; import function com.myorg.utils.UserAccountHelper.getAmount; rule "Classification userC" when $user : UserAccount(_age < 50); then // RHS可以直接调用导入的静态方法,不需要特殊声明 double amount = getAmount($user, "single"); $user.set_userClassification("userC"); end
2. 修复Java静态方法的逻辑bug
你当前的getAmount方法中switch分支缺少break语句,匹配到single分支执行完成后会直接穿透到default分支,最终永远返回0d,需要补充break:
public static double getAmount(UserAccount account, String status) { double amount = 0d; switch(status) { case "single": if (account.canBeFullyRefunded) amount = 1000; else amount = 100; break; // 新增break,避免分支穿透 default: amount = 0d; } return amount; }
3. 补充检查项
确认import function后的静态方法全限定名完全正确,没有拼写错误,对应的类和方法已经被正确加载到Drools运行的类路径中。
内容的提问来源于stack exchange,提问作者provista
相关产品推荐
相关产品推荐

