Drools中校验原始类型及插入Long值到kieSession的正确方法
问题原因分析
- 首先,Drools的工作内存(Working Memory)不会将
null作为Fact对象存储,你插入null到kieSession时会被直接忽略,规则中匹配值为null的Long类型Fact永远无法命中。 - 其次,你当前的规则是匹配工作内存中根级别为
Long类型的Fact,如果你实际插入的是包含id字段的业务对象,而非直接插入Long类型值,该规则也不会触发。 - 最后,Drools原生支持空值判断运算符,不需要额外调用
Objects.isNull静态方法,额外的方法调用还会降低规则匹配性能。
解决思路
分不同使用场景选择对应方案:
场景1:判断工作内存中不存在Long类型Fact
如果你的需求是校验工作内存中没有存入任何Long类型的id值,规则写法如下:
when not Long() then // 后续逻辑,比如插入默认id insert(10001L); end
not Long()的语义就是工作内存中不存在任何Long类型Fact,包含你插入null被忽略的场景。
场景2:校验业务对象中的Long类型id字段为null
如果你插入的是包含id字段的业务对象(比如User类,包含Long id属性),规则写法如下:
when $user: User(id == null) then // 后续逻辑,比如给user设置id,再插入Long类型值到session $user.setId(10002L); insert($user.getId()); end
场景3:校验已插入的Long类型值的范围
如果你已经确定插入的是不为null的Long类型值,需要校验值的合理性,直接用Drools原生运算符判断即可:
when $id: Long(this <= 0) then // 处理非法id的逻辑 end
内容的提问来源于stack exchange,提问作者Narges
相关产品推荐
相关产品推荐

