使用Drools规则进行实体验证

问题描述 投票:0回答:1

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

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

如果有人对此有任何建议,请在这里发表评论。

快乐编码!

java validation drools rules
1个回答
0
投票

您当然可以进行空检查。但是,如果这是要插入到数据库中的东西,则应该由数据库约束来真正解决。

无论如何,将您的示例与对象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

请注意,如果您要检查both personId和PersonNumber是否为空,则规则将有所不同;您不使用||运算符,而是使用逗号和:

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的含义,以致您[[want这些字段为空,以便可以由数据库自动设置它们,那么您可以将空检查反转为不为空通过将exists替换为not进行检查:

not( Person( personId == null || personNumber == null )) not( Person( personId == null, personNumber == null ))
...或通过将==交换为!==

关于您制定通用规则的问题,除非您要验证的所有对象都共享一个基类或接口,并且获取主键的方法是该基础的一部分,否则使用规则是不可能的类/接口。在

theory

中,您可以使用反射并创建Drools function来将一组请求的字段映射为null检查,但这似乎是一个非常糟糕的主意,而且非常脆弱。
© www.soinside.com 2019 - 2024. All rights reserved.