Drools 比较';中的值时可能出现错误;对象';领域

Drools 比较';中的值时可能出现错误;对象';领域,drools,jboss-tools,Drools,Jboss Tools,我已经能够在6.0.3和6.2.0中重新创建此错误。我不确定最好的解释方法,所以我将添加代码来复制它 我已将代码缩减到可能导致错误的程度。在我的原始代码中,我使用了其他一些类似的POJO。这并不是将所有这些类粘贴到中,而是使用一些具有相同效果的常见java类。但是,您可以使用任何类来获得相同的错误 EventObject-可以是存储“Object”并具有该字段的getter和setter的任何类 Random-可以是没有带单个字符串参数的构造函数的任何类 整数-可以是任何类 当规则比较字段中包含

我已经能够在6.0.3和6.2.0中重新创建此错误。我不确定最好的解释方法,所以我将添加代码来复制它

我已将代码缩减到可能导致错误的程度。在我的原始代码中,我使用了其他一些类似的POJO。这并不是将所有这些类粘贴到中,而是使用一些具有相同效果的常见java类。但是,您可以使用任何类来获得相同的错误

EventObject-可以是存储“Object”并具有该字段的getter和setter的任何类

Random-可以是没有带单个字符串参数的构造函数的任何类

整数-可以是任何类

当规则比较字段中包含的值且字段属于“Object”类时,有时规则会尝试创建一个新的对象实例,并将该值的字符串表示形式传递给构造函数

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!你说得对。我不想检查任何更新的版本。谢谢