【问题标题】:Entity validation using Drools rule使用 Drools 规则进行实体验证
【发布时间】:2020-04-11 08:55:14
【问题描述】:

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

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

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

编码愉快!!

【问题讨论】:

    标签: java validation drools rules


    【解决方案1】:

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

    无论如何,将您的示例与一个对象 Person 和两个字段 personId 和 PersonNumber 一起使用(忽略其他字段,因为它们不是立即相关的。)我将假设该类及其 getter 如下所示:

    class Person {
      private Integer personId, PersonNumber;
      public Integer getPersonId() {
        return personId;
      }
      public Integer getPersonNumber() {
        return PersonNumber;
      }
    }
    

    然后你可以编写一个规则来检查是否有一个 PersonId 或 PersonNumber 为 null 的人:

    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 的含义,以至于您希望字段为空,以便数据库可以自动设置它们,那么您可以反转空检查通过将exists 替换为not 来进行非空检查:

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

    ...或将== 换成!==

    至于您关于制定通用规则的问题,除非您要验证的所有对象都共享一个基类或接口,并且获取主键的方法是基类/接口。在理论上,您可以使用反射并创建Drools function 将一组请求的字段映射到空检查,但这似乎是一个非常糟糕的主意并且非常脆弱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2012-12-03
      • 2018-12-24
      相关资源
      最近更新 更多