在使用 Drools 5.5 final 比较字符串值字段时,我遇到了一些令人费解的问题。
本质上,我试图找出是否有一对同名的人。Person 类如下所示:
public class Person {
private String name;
public String getName() { return name; }
public void setName(String n) { this.name = n; }
public Person(String name) { this.name = name;}
}
Run Code Online (Sandbox Code Playgroud)
我尝试触发的规则是:
rule "uniquePersonName"
when
$p1: Person($n1: name)
$p2: Person(this != $p1, name == $n1)
then
System.out.println("Duplicated person name found : " + $n1 + " " + $p2.getName());
end
Run Code Online (Sandbox Code Playgroud)
但它从未被触发。但是,如果我将其更改为:
when
$p1: Person($n1: name)
$p2: Person(this != $p1, name != $n1)
Run Code Online (Sandbox Code Playgroud)
该系统按预期工作,换言之,它会找到所有具有不同姓名的人的配对。
深入挖掘后,我发现如果将 name 字段更改为 Integer 类型,则原始规则可以正常工作。这让我认为这是因为字符串比较的一些错误。因此,将 name 字段定义为 String 类型,我尝试了:
not (name == $n1)(name == $n1) name.toString() = $n1.toString() name == $p1.getName()不幸的是,他们都没有工作。
最后,我可以让它表现的唯一方法是将规则写为:
when
$p1: Person($n1: name)
$p2: Person(name == $n1)
eval($p1!=$p2)
Run Code Online (Sandbox Code Playgroud)
这让我觉得问题可能是由如何this 工作和如何完成字符串比较引起的。
这是非常基本的功能,我很惊讶这是由 Drools 5.5 final 中的错误引起的。但又一次,我看不到出路。你们中的任何人都可以帮忙吗?
谢谢。
GW
结果是this != $p1转换到!this.equals($p1)了幕后,在我的代码中,我有一个自动生成的equals方法(原始帖子中没有显示代码),它完全改变了默认的比较行为。删除该equals方法后,一切都按预期工作。
| 归档时间: |
|
| 查看次数: |
6667 次 |
| 最近记录: |