0

我正在使用 jboss EAP 7.2 和 Red Hat Decision Central 7.5.0

我有一个这样的自定义对象

public class Model{
    private String id;
    private Map<String, Object> map;

    // ... getters and setters
}

public class ParameterModel{
   private String parameterName;
   private BigDecimal maxValue;
   private BigDecimal minValue;
   private Object value;

   // ... getters and setters
}

我创建了具有自定义“id”属性的新“模型”对象,并且“地图”属性包含 <parameterName, ParameterModel> 对。

我将它发送给决策经理和流口水的一方,我想实现 ParameterModel 属性,但我做不到。

我的规则如下。

package com.rule.test;

import com.test.Model;
import com.test.ParameterModel;
    
rule "drools1"
    when
        Model(getId().equals("1"), Integer.parseInt(((ParameterModel)getMap().get("param1")).getValue().toString())>10)
    then
        System.out.println("Error on " + drools.getRule().getName());
end

例外情况如下。

引起:[错误:空指针:Integer.parseInt(((ParameterModel)getMap().get("param1")).getValue().toString())] [Near : {... Integer.parseInt(( (ParameterMo ....}] 在 [com/rule/test/test.drl 中的规则“drools1”]

原因:org.mvel2.ast.TypeCast.getReducedValueAccelerated(TypeCast.java:74) 的 org.mvel2.DataConversion.convert(DataConversion.java:129) 的 java.lang.NullPointerException 在 org.mvel2.compiler.ExecutableAccessor.getValue (ExecutableAccessor.java:38) 在 org.mvel2.compiler.ExecutableAccessor 的 org.mvel2.ast.Union.getReducedValueAccelerated(Union.java:44) 的 org.mvel2.ast.Substatement.getReducedValueAccelerated(Substatement.java:44)。 getValue(ExecutableAccessor.java:38) at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:970) at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:396)

谢谢你们。

4

1 回答 1

0

Drools 有很多内置的空值检查,但是如果你坚持绕过它,你最终会遇到很多错误。

另一种有趣的 Drools 是映射的特殊语法——get("foo")可以写成this["foo"].

rule "drools1"
when
  Model( id == "1", // equivalent to getId().equals("1")
         $map: map != null )

  // Special syntax for getting stuff from maps:
  Map( $param1: this["param1"] != null ) from $map 

  ParameterModel( $value: value != null ) from $param1
  Integer( this > 10 ) from Integer.parseInt($value.toString())
then
  System.out.println("Error on " + drools.getRule().getName());
end

为什么你的版本给出了 NPE?没有线索,但它的原始形式也几乎不可读。从堆栈跟踪中真正可以收集到的只是它发生在某个隐式转换步骤中。

当然,如果不是变成整数的字符串表示的东西,这个版本也会失败。valuetoString()

请注意,如果value实际上Integer 类型,那么您无需在 parse int 上浪费时间,只需执行以下操作:

Integer(this > 10) from $value
于 2020-08-17T17:45:53.573 回答