我可以使用 Drools 规则验证对象的主键值吗? 假设我有一个名为 Person 的对象,它有两个主键 personId 和 PersonNumber 以及许多其他字段,如年龄、职业等。我需要创建一个 Drools 规则来验证对象 Person 进行主键验证(主键不应该为空) .
如果可能的话我还有一个疑问。我可以将 Drools 规则作为验证其他对象的通用规则吗(它应该是动态的,因为所有字段都与其他对象不同)。
如果有人对此有建议,请在此发表评论。
祝你编码愉快!
最佳答案
当然,您可以进行空检查。但是,如果这是要插入数据库的内容,则确实应该由数据库约束来处理。
无论如何,使用您的示例与一个对象 Person 和两个字段 personId 和 PersonNumber (忽略其他字段,因为它们不立即相关。)我将假设该类及其 getter 如下所示:
class Person {
private Integer personId, PersonNumber;
public Integer getPersonId() {
return personId;
}
public Integer getPersonNumber() {
return PersonNumber;
}
}
然后您可以编写一条规则来检查是否存在 personId 或 PersonNumber 为 null 的 Person:
rule "Person with either personId or PersonNumber null"
when
exists( Person( personId == null || personNumber == null ))
then
System.out.println("Person has either null personId or PersonNumber");
end
请注意,如果您想检查 personId 和 PersonNumber 是否都为 null,则规则会略有不同;您不会使用 ||
运算符,而是使用逗号 and:
rule "Person with both personId and PersonNumber null"
when
exists( Person( personId == null, personNumber == null ))
then
System.out.println("Person has null personId and null PersonNumber");
end
或者,如果我误解了您所说的主键不应该为空
的意思,那么您希望字段为空,以便它们可以自动设置通过数据库,那么您可以通过将 exists
替换为 not
来将空检查反转为非空检查:
not( Person( personId == null || personNumber == null ))
not( Person( personId == null, personNumber == null ))
...或者将 ==
交换为 !==
。
关于制定通用规则的问题,规则是不可能的,除非您正在验证的所有对象共享基类或接口(interface),并且获取主键的方法是基类/接口(interface)。在理论中,您可以使用反射并创建 Drools function将一组请求的字段映射到空检查,但这似乎是一个非常糟糕的主意并且非常脆弱。
关于java - 使用 Drools 规则进行实体验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61154268/