变量库文件
在业务系统开发过程中,会用到大量包含Getter和Setter方法的简单的Java对象,它们被称之为POJO(Plain Ordinary Java Object),或BOM(Business Object Model)对象,这些对象在开发中作为数据的载体,负责数据的传递。在URule Pro当中,变量库就是用来映射这些POJO对象,从而使得我们可以在具体的规则文件中使用它们,从而完成规则与业务数据的交互。 进入URule Pro规则设计页,在“库”节点点击右键,在弹出的菜单中选择“添加变量库”就可以创建变量库文件,如下图所示:
创建好变量库文件后,可以看到系统会用变量库编辑器自动打开这个文件。在这个编辑器中,首先需要添加变量的分类,然后再添加具体的变量字段。对应到Java实体对象,就是要添加对应的实体对象信息,再添加这个实体对象所拥有的属性信息。如下图所示:
添加一个分类,输入名称,这个名称是对当前分类的描述,会在规则中直接引用显示,所以一般我们会使用中文描述来作为名称,类路径,就是这个分类对应的实体类的完整路径,比如上图中的“com.bstek.entity.Customer”。
无论是变量分类还是具体的变量,都有一个“用途”的属性,可选值有三个,分别是:In、Out、InOut,含义如下表所示:
名称 | 描述 |
---|---|
In | 表示该变量只能用于输入、不能用于输出,在规则中可以用于条件判断,但不能给这个变量赋值,同时在快速测试中,不能选择用于输出。 |
Out | 表示该变量只能用于输出、不能用于输入,在规则中既可以用于条件判断,也可以给这个变量赋值,但在快速测试中,不能选择其用于输入,只能选择其作为输出。 |
InOut | 表示该变量即可以作为输入、也可以作为输出。 |
变量的类路径是规则引擎在执行过程中查找对应对象的唯一标识,所以在定义时一定要让其与实际业务中对应的POJO对象的完整类路径一致,否则在运行时将会出现找不到类的情况,或者使得规则在计算时不会出现我们期望的结果。
变量类路径也可以理解为一个变量的ID,实际使用时,这个类路径对应的类可以是不存在的,这样在代码中我们可以使用GeneralEntity来模拟这个类对象。在引擎提供的快速测试以及Rest调用中,所有的变量对象都是通过GeneralEntity模拟运行。
“参数”是系统的保留字,专门用于“参数库”文件使用,因此在变量分类名称定义时,不能使用“参数”。
变量维护的5种方式
手工添加字段
点击上图中的“添加字段”按钮,即可在右侧表格中多一个空白行,在新增行中分别填充【字段名称】【标题】【数据类型】等内容,说明如下:
名称 | 描述 |
---|---|
字段名称 | 字段属性名称,能常定义为通俗易懂的英文表示,符合java的驼峰命名法,且在该字段列表中是唯一的,多数在后台程序调用时会用到 |
标题 | 字段的中文说明,在规则设计器中显示,在当前变量中应该保持唯一性 |
数据类型 | 在格表中下拉选择合适的数据类型:String字符串,Integer短整型,Long长整型,Float短浮点型,Double长浮点型,BigDecimal金融浮点型,Date日期,Map集合,List集合,Object对象型 |
用途 | 同上【添加变量】中的说明 |
默认值 | 同下【变量字段默认值】中的说明 |
根据类路径生成字段
这时,需要先定义变量的分类,如果当前定义的类路径对应的类在当前应用中存在的话(通常需要程序员的协助,先定义好变量,然后在“Jar文件热部署功能”中上传到服务器)),那么可以在当前变量分类所在行点击右键,在弹出的菜单中选择“根据类路径生成字段”,系统就会通过Java的反射功能生成当前类对应的所有字段信息。上图中com.bstek.entity.Customer类源码如下所示:
package com.bstek.entity;
import java.util.Date;
import com.bstek.urule.model.Label;
/**
* @author Jacky.gao
* @since 2016年9月29日
*/
public class Customer {
@Label("名称")
private String name;
@Label("年龄")
private int age;
@Label("出生日期")
private Date birthday;
@Label("等级")
private int level;
@Label("手机号")
private String mobile;
@Label("性别")
private boolean gender;
@Label("是否有车")
private boolean car;
@Label("婚否")
private boolean married;
@Label("是否有房")
private boolean house;
//省略上述所有属性对应的getter与setter方法......
}
在这个类当中,可以看到每个属性都有一个名为Label的annotation,它是一个由URule Pro提供的用来描述字段属性的annotation,这里描述的值,在生成变量时会自动写到变量的“标题”当中,这里的标题将会在规则中直接引用,让标题有意义,对于规则的清晰表达很有价值。
如果这个类在当前所在的项目当中,所以可以直接通过反射生成所有的属性,生成后的效果如下:
可以看到上图中Label这个annotation对应的描述写入到变量的“标题”当中。
这到里,变量库文件就定义好了,可以根据需要在一个文件中添加多个变量 分类,相应对应到多个POJO类。
根据数据库表生成字段
- 在使用该功能前,应首先在【数据源配置】功能中,定义一个数据源,并保证可用
- 右键目标变量“根据数据库表生成字段”,弹出如下画面:选择数据源,填写“表名称”,点击“刷新字段”按钮,如下图所示:
- 点击确认后,再指定“用途”后,如下所示:
根据JSON生成字段
选中目标变量后,右键行“根据JSON生成字段”弹出如下窗口:
- 输入合格的JSON数据
{
"name":"张三",
"sex":"男",
"age":"30"
}
- 点击下一步,进入“对象树”窗口
- 点击下一步,进入“字段列表”窗口
- 点击【确认】按钮后,回到如下窗口,然后按需调整“标题”、“数据类型”、“用途”、“默认值”的单元格内容
说明:在实际生产中,可能某些用户会存在根据‘一个json数据’快速生成变量的需求,那么此时“JSON生成字段”的功能特征就能用上。
excel导入
变量字段默认值
字段默认值,默认为空。如果字段设置默认值,当调用规则时,用到当前字段,发现为空时将会使用默认值。
这样就省去了以前需要判断字段是否有值的条件判断。如不需要默认值,保持原样不设置默认值即可。
默认值功能在调用规则传入变量、变量类型的参数 、规则中动态生成实例时,均有效。
但如果用Java API调用规则,参数是变量类型,传入前需要调用 Utils.assignVariableObjectDefaultValue(参数,session);
再触发执行规则。
参考如下代码:
//从Spring中获取KnowledgeService接口实例
KnowledgeService service=(KnowledgeService)Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
//通过KnowledgeService接口获取指定的知识包ID"213"
KnowledgePackage knowledgePackage=service.getKnowledge("213");
//通过取到的KnowledgePackage对象创建KnowledgeSession对象
KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);
GeneralEntity employee=new GeneralEntity("rete.test.Employee");
employee.put("id","0001");
employee.put("name","马克");
employee.put("salary",111000);
//根据变量库设置的默认值设置变量实例
Utils.assignVariableObjectDefaultValue(employee,session);
Map<String,Object> parameter=new HashMap<String,Object>();
parameter.put("currentEmployee", employee);
//开始规则流并设置参数
session.startProcess("flow-test",parameter);
改变表格行显示顺序
在上图中,通过右键表格数据行的【上移】【下移】项,来改变显示的先后顺序,有将常用的字段顺序放在前面,有利于规则设计人员在规则文件设计画面中快速选择,以提升工效。