【发布时间】:2015-03-24 01:19:40
【问题描述】:
我正在使用 Drools 6.1.0.FINAL 和无状态会话来触发所有规则。
我的 .drl 文件中有以下 2 条简单规则。
rule "Null Check"
when
$paymentHolder : PaymentHolder(pmtRequest.requestDetails == null
|| pmtRequest.requestDetails.paymentData == null
|| pmtRequest.requestDetails.paymentData.accountDetails == null
|| pmtRequest.requestDetails.paymentData.payments == null
|| pmtRequest.requestDetails.paymentData.payments.payment == null
|| pmtRequest.requestDetails.paymentData.payments.payment.get(0).tenderDetails == null
|| pmtRequest.requestDetails.paymentData.payments.payment.get(0).tenderDetails.paymentCardDetails == null
|| pmtRequest.requestDetails.paymentData.payments.payment.get(0).tenderDetails.paymentCardDetails.authorizationInfo == null)
then
System.out.println("Some Manadatory data is null ");
// populate error code and error message
List<ErrorHolder> errors = $paymentHolder.getErrors();
ErrorHolder erroHolder = new ErrorHolder();
errors.add(erroHolder);
erroHolder.setErrorCode(com.wdpr.payment.exception.ErrorCode.MANDATORY_DATA_MISSING);
// drools.halt();
// kcontext.getKieRuntime().halt();
end
rule "Amount is -ve"
when
$paymentHolder : PaymentHolder(errors.size() == 0)
$paymentHolder(pmtRequest.getRequestDetails()!.getPaymentData().getPayments().getPayment().get(0).getAmount().getAmount() < 0)
then
//System.out.println(paymentHolder.getProcessId());
System.out.println("Amount is -ve");
//throw new com.wdpr.payment.exception.PaymentPlatformException(com.wdpr.payment.exception.ErrorCode.DATA_RANGE_INVALID, "Data Range Invalid - Amount", null);
end
我想这样做:如果第一条规则为真,则不执行任何其他规则并退出 .drl 文件。
我尝试了以下操作:
-
试图在第一个规则中抛出一个运行时异常,但它仍然会因为 NullPointerException 而失败。
-
添加了 drools.halt() 和 kcontext.getKieRuntime().halt() 但没有奏效,继续下一条规则。
-
所以我在我的第一条规则中的自定义 erroHolder 中添加了一些错误代码,并在第二条规则中检查了相同的条件,这样它就不会被执行,但它仍然会被执行并抛出 NullPointerException。
如果我删除第二条规则,那么第一条规则将完美执行并打印系统输出。但是当我使用这两条规则运行我的 .drl 时,它给了我低于 NPE
堆栈跟踪
Exception in thread "main" java.lang.RuntimeException: Error while creating KieBase[Message [id=1, level=ERROR, path=com/my/payment/rules/validation.drl, line=40, column=0
text=[ERR 102] Line 40:53 mismatched input '!.' in rule "Amount is -ve"], Message [id=2, level=ERROR, path=com/my/payment/rules/validation.drl, line=0, column=0
text=Parser returned a null Package]]
at org.drools.compiler.kie.builder.impl.KieContainerImpl.getKieBase(KieContainerImpl.java:349)
at org.drools.compiler.kie.builder.impl.KieContainerImpl.newStatelessKieSession(KieContainerImpl.java:540)
at org.drools.compiler.kie.builder.impl.KieContainerImpl.newStatelessKieSession(KieContainerImpl.java:528)
at com.my.payment.workflow.DroolsRuleProcessor.runRules(DroolsRuleProcessor.java:58)
at com.my.payment.workflow.DroolsRuleProcessor.main(DroolsRuleProcessor.java:81)
我的java代码sn-p
// some code
final StatelessKieSession kSession = this.kContainer.newStatelessKieSession(rulesSession);
// provide the necessary data and execute rules.
kSession.execute(paymentHolder);
注意:我不想使用 salient 和 activate-group
【问题讨论】:
标签: java drools bpmn business-rules