记工作中一个规则匹配引擎

2019-04-03  本文已影响0人  吃板栗的猫

项目背景

根据json模板中的属性来匹配实体的属性值,判断属性是否满足条件,从而进一步走不同的业务逻辑;
优点:灵活性高,不用每次都改代码,参与只需动态配置json模板;

举个例子:给满足会员生日条件的会员送礼物

会员有birthday、mobile、等等等等属性
jsonTemplate:"{"max_num":88,"type":1,"member":{"attribute":"birthday","compare":"><=","value":"1970-01-01"}}";
jsonTemplate里面有birthday属性,而我们的会员实体里面也有这个属性,我们就可以比较实体的这个属性值是否与jsonTemplate里面的需要相比较判断是否满足条件;
如果我们下次要改成匹配mobile这个属性,那么只需要修改这个jsonTemplate这个模板即可,代码就不用更改了,使用起来相当灵活;

实现原理

1.入参:Object实体、jsonTemplate字符串(根据业务场景不同,这里可变)
2.得到jsonTemplate需要比较的属性名和值
3.利用反射得到属性名字段并获取值作比较,判断是否满足条件即可

一个简单的代码Demo
Demo
踩过的坑

由于现在的项目采用的是Scala&Java,我这边传入的实体是Scala的case class类,刚开始运行的时候获取不到字段,后来改用了getDeclaredField,然后就正常了,然后就用反编译查看case class,果不其然,case class里面的属性默认都是被private修饰的,提供了getter setter方法,所以getField是获取不到的;
下面是踩坑截图;


Demo
补充:由于比较规则是一个字符串,要转换为运算符需要如下操作,jdk1.8的特性
image.png
上一篇下一篇

猜你喜欢

热点阅读