我在drools 5.0.1的when子句中使用Character对象时遇到问题。
以下是不的规则:
rule "Test"
when
$V1 : MyObject( )
$V2 : EvalObject(
$V1.getMyCharacter == "1"
)
then
//do stuff
end
执行工作的规则
rule "Test"
when
$V1 : MyObject( )
$V2 : EvalObject(
$V1.getMyCharacter == "C"
)
then
//do stuff
end
MyObject有一个名为myCharacter的Character字段。我想看看myCharacter是否为数字1.EvalObject只是一个空类。
似乎drools使用Character数据类型做了一些奇怪的事情。当比较针对非数字值时,它可以工作。当比较与数值相比时,它不起作用。
为什么数字字符比较在Drools 5.0.1中不起作用?
注意,我确实找到了两个下面的解决方法。
rule "Test"
when
$V1 : MyObject( )
$V2 : EvalObject(
eval($V1.getMyCharacter().equals('1'))
)
then
//do stuff
end
rule "Test1"
when
$V1 : MyObject(myCharacter == "1")
then
//do stuff
end
答案 0 :(得分:0)
此条件的错误:
$V1 : MyObject( )
$V2 : EvalObject( $V1.getMyCharacter == "1" )
是不允许将getter方法名称与事实(对象)引用名称结合使用,就好像它是一个字段一样。您可以在比较中使用字段作为成员的模式中使用字段名称(请参阅下面的Test1)或绑定变量(Test2,Test3),或者可以将方法名称与绑定到a的变量结合使用事实上在eval
表达式中使用适当的Java语法(Test3,Test4)。
没有必要为编写约束创建一个单独的对象 - 在其他任何事情之前尝试Test1。将带有字段的约束放在字段所在的模式中:
rule "Test1"
when
MyObject( myCharacter == '1' )
then
//do stuff
end
如果这不起作用,条件元素eval
应该在模式内或单独使用。
rule "Test2"
when
MyObject( $mc: myCharacter, eval( $mc == '1' ) )
then
//do stuff
end
rule "Test3"
when
MyObject( $mc: myCharacter )
eval( $mc == '1' )
then
//do stuff
end
rule "Test4"
when
$mo: MyObject()
eval( $mo.getMyCharacter() == '1' )
then
//do stuff
end