java - 使用 Drools 规则进行实体验证

标签 java validation drools rules

我可以使用 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/

相关文章:

java - 执行我的 drools 规则后如何返回多个 Assets ?

java - 为什么缓存的 Drools KIE 基础仍然需要源 .drl 文件?

java - 将规则添加到现有的 KiePackage 和 KieBase 中

java - 导入类似包的类

validation - 验证 ui :repeat 中项目的顺序

java - 通过 gradle 运行特定的@Issue

java - 可以使用此模式进行值检查吗?

javascript - 使用验证插件 jquery 验证输入数组 - 显示每个输入的错误

java - 将 Element 转换为不带 <?xml version=...> 前缀的 XML 字符串

java - 如何为多个 jvm 支持创建单例 java 类?