使用Drools规则进行实体验证



我可以使用Drools规则验证对象的主键值吗?假设我有一个名为Person的对象,它有两个主键personId和PersonNumber以及许多其他字段,如年龄、职业等。我需要创建一个Drools规则来验证对象Person以进行主键验证(主键不应该为null(。

如果可能的话,我还有一个疑问。我可以将Drools规则作为验证其他对象的通用规则吗(它应该是动态的,因为所有字段都会相对于其他对象有所不同(。

如果有人对此有意见,请在这里发表评论。

快乐编码!!

当然,您可以进行null检查。但是,如果这是插入到数据库中的东西,那么它确实应该由数据库约束来处理。

无论如何,使用一个对象Person和两个字段personId和PersonNumber的示例(忽略其他字段,因为它们不直接相关。(

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,则规则会有点不同;不使用||运算符,而是使用逗号和:

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

或者,如果我误解了Primary key shouldn't be not null的含义,以至于您希望字段为空,以便数据库自动设置它们,那么您可以通过用not:替换exists,将空检查反转为非空检查

not( Person( personId == null || personNumber == null ))
not( Person( personId == null, personNumber == null ))

或者通过将CCD_ 5交换为CCD_。

至于您关于生成泛型规则的问题,除非您正在验证的所有对象都共享基类或接口,并且获取主键的方法是基类/接口的一部分,否则规则不可能实现这一点。在理论中,您可以使用反射并创建Drools函数来将一组请求的字段映射到null检查,但这似乎是一个非常糟糕的想法,而且非常脆弱。

最新更新