【问题标题】:Drools - Executing consequence for rule ... unable to access fieldDrools - 执行规则的结果......无法访问字段
【发布时间】:2020-12-14 16:13:28
【问题描述】:

有谁知道哪里出了问题?我在触发规则时收到此错误,但并非总是如此,但根本不能有任何空值。 我发现这个 2013 年的错误报告 (http://drools-moved.46999.n3.nabble.com/Exception-executing-consequence-for-rule-xxx-in-yyy-java-lang-RuntimeException-unable-to-access-field-td4021553.html) 似乎是同样的问题,但没有答案。

规则:

    rule "CALCULATE PARTNER ACCEPTABLE INCOME WHEN HAS PARTNER"
        agenda-group "calculation"
        when
            request:MortgageRequestDto(hasPartner == true)
        then
            response.calc.partnerAcceptableIncome = request.getPartnerIncome() * response.calc.partnerProfileMultiplier;
    end

堆栈跟踪:

2020-12-14T14:37:15.119941721Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    | org.kie.api.runtime.rule.ConsequenceException: Exception executing consequence for rule "CALCULATE PARTNER ACCEPTABLE INCOME WHEN HAS PARTNER" in defaultpkg: java.lang.RuntimeException: unable to access field
2020-12-14T14:37:15.119945181Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
2020-12-14T14:37:15.119948830Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.common.DefaultAgenda.handleException(DefaultAgenda.java:1291)
2020-12-14T14:37:15.119951747Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.phreak.RuleExecutor.innerFireActivation(RuleExecutor.java:438)
2020-12-14T14:37:15.119955343Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.phreak.RuleExecutor.fireActivation(RuleExecutor.java:380)
2020-12-14T14:37:15.119958280Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.phreak.RuleExecutor.fire(RuleExecutor.java:136)
2020-12-14T14:37:15.119961292Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:89)
2020-12-14T14:37:15.119964002Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.concurrent.AbstractRuleEvaluator.internalEvaluateAndFire(AbstractRuleEvaluator.java:33)
2020-12-14T14:37:15.120003972Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.concurrent.SequentialRuleEvaluator.evaluateAndFire(SequentialRuleEvaluator.java:43)
2020-12-14T14:37:15.120008230Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.common.DefaultAgenda.fireLoop(DefaultAgenda.java:1101)
2020-12-14T14:37:15.120011412Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.common.DefaultAgenda.internalFireAllRules(DefaultAgenda.java:1048)
2020-12-14T14:37:15.120014520Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1040)
2020-12-14T14:37:15.120017519Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1341)
2020-12-14T14:37:15.120020613Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1332)
2020-12-14T14:37:15.120023605Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1316)
2020-12-14T14:37:15.120026733Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at io.gbsolutions.scportal.service.MortgageRulesService.calculateMortgageOffer(MortgageRulesService.java:46)
2020-12-14T14:37:15.120030027Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at io.gbsolutions.scportal.service.MortgageOfferProviderService.provideOffer(MortgageOfferProviderService.java:28)
2020-12-14T14:37:15.120033279Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at io.gbsolutions.scportal.controller.messaging.MessagingController.calculateMortgage(MessagingController.java:55)
2020-12-14T14:37:15.120043891Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at jdk.internal.reflect.GeneratedMethodAccessor435.invoke(Unknown Source)
2020-12-14T14:37:15.120051955Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
2020-12-14T14:37:15.120054960Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at java.base/java.lang.reflect.Method.invoke(Method.java:566)
2020-12-14T14:37:15.120057856Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171)
2020-12-14T14:37:15.120061135Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120)
2020-12-14T14:37:15.120064419Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch(AbstractMethodMessageHandler.java:565)
2020-12-14T14:37:15.120067710Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:511)
2020-12-14T14:37:15.120070642Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:94)
2020-12-14T14:37:15.120074432Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler.java:520)
2020-12-14T14:37:15.120077489Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:454)
2020-12-14T14:37:15.120080746Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:144)
2020-12-14T14:37:15.120083899Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
2020-12-14T14:37:15.120087192Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
2020-12-14T14:37:15.120089817Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at java.base/java.lang.Thread.run(Thread.java:834)
2020-12-14T14:37:15.120092788Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    | Caused by: java.lang.RuntimeException: unable to access field
2020-12-14T14:37:15.120095574Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.mvel2.optimizers.impl.refl.nodes.FieldAccessor.setValue(FieldAccessor.java:63)
2020-12-14T14:37:15.120098460Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.mvel2.optimizers.impl.refl.nodes.VariableAccessor.setValue(VariableAccessor.java:46)
2020-12-14T14:37:15.120101335Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.mvel2.compiler.CompiledAccExpression.setValue(CompiledAccExpression.java:59)
2020-12-14T14:37:15.120104271Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.mvel2.ast.DeepAssignmentNode.getReducedValueAccelerated(DeepAssignmentNode.java:90)
2020-12-14T14:37:15.120107607Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
2020-12-14T14:37:15.120110709Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.mvel2.compiler.CompiledExpression.getDirectValue(CompiledExpression.java:123)
2020-12-14T14:37:15.120113896Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:119)
2020-12-14T14:37:15.120116870Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.mvel2.MVEL.executeExpression(MVEL.java:945)
2020-12-14T14:37:15.120119850Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.base.mvel.MVELConsequence.evaluate(MVELConsequence.java:110)
2020-12-14T14:37:15.120126303Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.drools.core.phreak.RuleExecutor.innerFireActivation(RuleExecutor.java:431)
2020-12-14T14:37:15.120129433Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   ... 28 common frames omitted
2020-12-14T14:37:15.120133412Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    | Caused by: java.lang.RuntimeException: unable to access field
2020-12-14T14:37:15.120136689Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.mvel2.optimizers.impl.refl.nodes.FieldAccessor.setValue(FieldAccessor.java:89)
2020-12-14T14:37:15.120139641Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.mvel2.optimizers.impl.refl.nodes.FieldAccessor.setValue(FieldAccessor.java:60)
2020-12-14T14:37:15.120143066Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   ... 37 common frames omitted
2020-12-14T14:37:15.120146043Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    | Caused by: java.lang.NullPointerException: null
2020-12-14T14:37:15.120149039Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.mvel2.DataConversion.convert(DataConversion.java:129)
2020-12-14T14:37:15.120151933Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   at org.mvel2.optimizers.impl.refl.nodes.FieldAccessor.setValue(FieldAccessor.java:73)
2020-12-14T14:37:15.120154957Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    |   ... 38 common frames omitted
2020-12-14T14:37:15.120157528Z gb-swarm_scportal.2.j7pbdve9cs6n@grbs0088    | 

【问题讨论】:

  • 什么版本的 Drools? response 是什么?发生错误时,requestresponse 是什么样的?
  • global CalculatorResponse response global io.gbsolutions.scportal.error.error.GbsErrorResponse gbsErrorResponse; 这些是全局变量,规则中用于计算的值不为空
  • Drools 版本为 7.40.0
  • 我见过很多旧版本的drools(例如5.0)在以不确定的方式访问嵌套对象时遇到问题。如果这样更容易,我建议使用 setter 或创建实用方法。

标签: java spring drools


【解决方案1】:

用 MVEL 评估结果似乎是个问题

首先,您使用的是 MVEL 方言吗?你应该在某处写dialect "mvel"

您也可以尝试原始帖子中的解决方法吗?使用 setter 代替字段访问

The workaround seems to be to replace the field assignment with a setter invocation on the field. 
i.e. 

   in lieu of 

     when 
              ... 
      then 
             $foo.x = $bar.y +$bar.z 
             ... 
      end 

do - 

     when 
              ... 
      then 
             $foo.setX($bar.y +$bar.z) 
             ... 
      end 

让我们知道

【讨论】:

  • MVEL 方言是全局设置的,但对于某些规则,我们使用方言“java”,但这是在特定规则中设置的
  • 我会尝试使用 setter,但我不知道为什么会这样,因为“partnerAcceptableIncome”字段是公开的
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
相关资源
最近更新 更多