You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:30:01