Drools 比较';中的值时可能出现错误;对象';领域
我已经能够在6.0.3和6.2.0中重新创建此错误。我不确定最好的解释方法,所以我将添加代码来复制它 我已将代码缩减到可能导致错误的程度。在我的原始代码中,我使用了其他一些类似的POJO。这并不是将所有这些类粘贴到中,而是使用一些具有相同效果的常见java类。但是,您可以使用任何类来获得相同的错误 EventObject-可以是存储“Object”并具有该字段的getter和setter的任何类 Random-可以是没有带单个字符串参数的构造函数的任何类 整数-可以是任何类 当规则比较字段中包含的值且字段属于“Object”类时,有时规则会尝试创建一个新的对象实例,并将该值的字符串表示形式传递给构造函数Drools 比较';中的值时可能出现错误;对象';领域,drools,jboss-tools,Drools,Jboss Tools,我已经能够在6.0.3和6.2.0中重新创建此错误。我不确定最好的解释方法,所以我将添加代码来复制它 我已将代码缩减到可能导致错误的程度。在我的原始代码中,我使用了其他一些类似的POJO。这并不是将所有这些类粘贴到中,而是使用一些具有相同效果的常见java类。但是,您可以使用任何类来获得相同的错误 EventObject-可以是存储“Object”并具有该字段的getter和setter的任何类 Random-可以是没有带单个字符串参数的构造函数的任何类 整数-可以是任何类 当规则比较字段中包含
import java.util.EventObject;
import java.util.Random;
/**
* The offending line is the comparison of the EventObjects Source (an Integer
* in this case) with the Random. Occasionally when trying to compare the two,
* the rules processor tries to find a constructor for Random that has a string.
* If it finds one, it attempts to pass String.valueOf(Integer) to the
* constructor. If it doesn't find it, a reflections error is thrown:
* java.lang.NoSuchMethodError: java.util.Random.<init>(Ljava/lang/String;)V
*
* The actual classes for the three types don't matter as long as EventObject is
* any class that contains an Object field that can be set and retrieved, and
* Random is any class that does not contain a Constructor with a single
* String argument
*/
rule "Insert objects"
dialect "java"
agenda-group "aHiddenAgenda"
when
not Integer()
then
/* add more EventObjects to increase the failure rate. 10 almost always
* works, 1000 almost never works
*/
for(int i = 0; i < 175; i++) {
insert(new EventObject(new Integer(i)));
}
for(int i = 0; i < 10; i++) {
insert(new Random());
}
end
rule "Find a Random where no EventObject contains it"
dialect "java"
agenda-group "aHiddenAgenda"
when
$toCompare : Random()
not EventObject( $toCompare == source )
then
end
import java.util.EventObject;
导入java.util.Random;
/**
*有问题的行是EventObjects源(一个整数)的比较
*在这种情况下)与随机。偶尔在比较两者时,
*规则处理器尝试为具有字符串的Random查找构造函数。
*如果找到一个,它会尝试将String.valueOf(Integer)传递给
*构造器。如果找不到,将抛出反射错误:
*java.lang.NoSuchMethodError:java.util.Random.(Ljava/lang/String;)V
*
*这三种类型的实际类并不重要,只要EventObject是
*包含可设置和检索的对象字段的任何类,以及
*Random是任何不包含具有单个
*字符串参数
*/
规则“插入对象”
方言“java”
议程组“AHIDENAGNDA”
什么时候
非整数()
然后
/*添加更多EventObjects以提高故障率。10几乎总是
*有效,1000几乎不起作用
*/
对于(int i=0;i<175;i++){
插入(新事件对象(新整数(i));
}
对于(int i=0;i<10;i++){
插入(新的Random());
}
结束
规则“查找没有EventObject包含的随机事件”
方言“java”
议程组“AHIDENAGNDA”
什么时候
$toCompare:Random()
非EventObject($toCompare==source)
然后
结束
好的,您在6.2.0及更早版本中遇到了一个bug
在6.3.0和6.4.0版本中,我已经尝试过了,可能是更高版本。比较java.util.Random和EventObject.source是一个非常奇怪的想法。你想用这套奇怪的规则来完成什么?我只是选择了这些类,这样它就可以使用普通的java对象,而且bug很容易重现。您可以在它的位置使用任何类。我发现它只是用了一些我做的pojo,这里没有bug。WM中有175个EventObject事实和10个随机事实。它们没有共同点。是的,我希望第二条规则永远不会触发,但规则集应该完成。相反,在java的equals()方法中,我得到了一个异常
java.lang.NoSuchMethodError:java.util.Random.(Ljava/lang/String;)V
的崩溃。请注意,比较两个不同的类(在这个规则中,实际上是比较一个整数和一个随机数),这不会导致异常,它只是说它们不是equalAh!你说得对。我不想检查任何更新的版本。谢谢