说明
配置主要分为映射信息配置和spring配置文件application的配置
映射信息
映射信息通常指的是所配置的po类与映射表的相关信息,通过相关注解来获取相关的静态信息,当然这里也可以通过其它的渠道来加载这些配置信息,如数据库、xml文件等,通过框架内部提供的自定义处理器来加载这些信息,下面就接着说明如何配置一个po类,先附上一个例子
@JSRuleTable(name= "zs_test")
@Data
public class ZsTestPO {@JSRuleField(pk=true)private String id;private String name;@JSRuleField(name= " create_date ")private Date create_date;@JSRuleField(name= "birth_day")private Date birthDay;private double salary;private String remark;private Double bonus;@JSRuleField(name= "test_field",alias="sum_test_field")private String test_field;@JSRuleField(name= "sum1_salary",alias="lbv_salary")private String sumSalary;@JSRuleField(name= "qian",imports= {"qian"})private String qian;
}
@JSRuleTable(name="zs_test_son2")
public class ZsTestSon2 {@JSRuleField(pk=true)public String id;@JSRuleField(name= "zs_test_id",fk="ZsTestPO",dependent= "ZsTestPO.id")public String zs_test_id;@JSRuleField(name= "zs_test_id",fk="view.neibu.ZsTestPOView",dependent= "view.neibu.ZsTestPOView.id")public String zs_test_id2;@JSRuleField(name= "zs_test_id",fk="ZsTestPOCopy")public String zs_test_id3;@JSRuleField(name= "zs_test_son1_id",fk="ZsTestUpdate")public String zs_test_son_id;@JSRuleField(name="zs_test_son1_id",fk= "view.ZsTestView")public String zs_test_son1_id2;@JSRuleField(name= "oh_yes")public String ohYes;public String test_field_a;@JSRuleField(dependent= "ZsTestPO.name")public String name;
}
相关注解说明
- @JSRuleTable:如果当前类是在locations路径下,那么类上必须要有这个注解
name:所关联的数据库表的名字
view:所关联的是一个视图,该属性需要指定一个sql语句,若指定了该属性,则name属性将会成为该sql视图的别名,若是不确定所要查询的字段都有哪些,此时可以用#符号代替具体的字段,where条件的具体值可用?符号代替,后续可在json中确定这些参数,这些将在后续的高级查询中进行详细说明,例子
@JSRuleTable(name="suibian",view="select # from zs_test_son1 where oh_no=? and id like ?")
- @JSRuleField:当字段没有加注该注解时采用默认值,如字段名默认就是数据库表字段名
name:所关联的数据库表的字段的名字
pk:是否为主键字段,仅支持单主键,默认为false
fk:表示当前字段是一个外键,需指定所要关联的类的名称
alias:字段的别名,用于返回结果集时所最终展示的名称
imports:使用导入插件时,指定当前字段对应导入excel时sheet中数据列头的值,这里可以是中文,也可以定义多个值,表示某一列的数据是对应当前字段的
export:使用导出插件时,当json中未指定模板时该配置为默认的导出列头,这里的值为列头的显示值,可以是中文
dependent:使用主子表插件时,当某一个子表的字段需要从主表的某一个字段取值时,如主外键(默认),此时这里应配置对应的某个主类的某个字段
ignore:忽略对于当前字段的加载,默认为false
spring配置文件说明
配置文件所对应的java对象为edi.rule.config.JSRuleProperties,先上一个application的例子
edi:rule:locations: test.business.po,test.business.po2,test.business.po3#processor: test.myrule.JSRuleDBProcessor#intercepts: /asdqwe/zxc/**,/json/script/**mybatis: #showNull: truepagehelper:#dialect: mysqlpageSizeZero: truehttp: #connectTimeout: 10000readTimeout: 10000open:sql: trueengineDuration: true#replenishColumns: true#close:models: test.business.rule.model.JSRuleGetCustomModel#config:dateFormat: yyyy-MM-dd HH:mm:ss,yyyy/MM/dd HH:mm:ss#encrypt:type: sm2sm2PublicKey: 04a14dd8d62e90d5cfd7b59ce89e346e0e7def05281361f7ef47676c1e534ca85b3d88839b02e9b57b2818f46beeea4eb88a3e5abe429d0e866ddea9c8c7756f7asm2PrivateKey: 00f8d5d53f123f1a001403a27acb16b8408dff48f249b2ed7d2429b3394628bc36poi:excel:importFilterEmptyRow: true
下面是application-mysql.yml
edi:rule:database: mysql
提示:application-mysql.yml会覆盖掉application已存在的配置属性
注意:框架采用ConfigurationProperties封装配置属性,其内部结构采用多层次的内部类进行映射,如果一个类属性下的所有属性都被注释掉了,那么有可能会引发ConfigurationProperties封装报错问题导致无法启动。这时可以注释其类的本身来屏蔽掉所有属性即可,如注释掉poi或者注释掉excel都可以,而不是注释掉其内部类下的唯一属性importFilterEmptyRow,如果excel下还有其它属性,那么不会引发此问题
- locations:映射po类的包的根路径,该配置用于对数据库表的操作,不配置该属性还可通过扩展类JSRuleDefaultExtend进行配置,3.2.4版本之后允许有多个路径,多个路径下的包名+类名应尽量避免重复,如果重复则需要写出相应的全路径类名
- processor:自定义处理器,如果你的映射信息来自于非java的po类(如数据库、xml文件等),那么需要配置一个处理器,该属性指定处理器的位置,该处理器应当继承edi.rule.extend.classes.JSRuleInitByExtend
- database:这里有4个属性,分别是postgresql、mysql、oracle,kingbase,根据自己数据库的类型对应选择即可,默认为mysql
- intercept:json rule拦截器路径配置,该配置用于拦截json rule的请求,将请求的json初始化成JSBody对象参数并放入threadLocal中,它默认与请求框架控制器中的路径是一致的,因此在不自定义控制器的情况下是不需要配置的
- open.sql:是否打印框架内部查询功能拼装的最终sql语句到日志中,默认是不打印的,通常用于调试,也可以使用mybatis内置的sql打印功能,不相冲突
- open.superProp:当po类继承父类时是否加载po类的继承属性,默认为false
- open.engineDuration:是否开启执行时间计算,默认为false,打开后会在返回结果的log中展示此次请求耗费的时间(毫秒)
- open.replenishColumns:默认为false,这个配置只针对mysql数据库,它表示是否补全空的列为null值,mysql批量插入时如果数据一和数据二的列数不一致,则将会导致数据库报错,这里如果配置为true则会保证数据列的一致性,缺失的列会以null的形式注入。如果传输到后端的每一条数据都能够保证数据列数一致,那么这里就可以节约一定的资源消耗,否则将注意该属性的配置
- close.engineController:是否关闭内置Controller,默认是开启的,该Controller用于接受并处理前端json请求,通常在自定义Controller后可关闭此默认的内置Controller
- close.models:禁用某些插件,如内置的查询插件edi.rule.model.JSRuleGet,需写全类名,多个用逗号进行分割,如下
edi:rule:close:models: test.business.rule.model.JSRuleGetCustomModel,edi.rule.model.JSRuleGet
- config.dateFormat:用于配置日期格式,凡是日期格式的字符串会在后端自动转化为日期类型进行处理,这包括插入数据时,查询日期区间时,以及断言里判断时间范围等,配置多个日期格式时需用逗号分割开,未配置时则采用默认格式,系统默认日期格式如下
dateFormat: yyyy-MM-dd,yyyy-MM-dd HH:mm:ss
- http.engineControllerUrl:用于配置远程请求时对方的引擎地址,没有start和end后缀,如
http://ip:port/context-path/json/script
- http.connectTimeout:连接超时配置,参考SimpleClientHttpRequestFactory
- http.readTimeout:读取超时配置,参考SimpleClientHttpRequestFactory
- mybatis.showNull:json rule框架mybatis的设置,它与开发者实际项目中的mybatis完全分离,showNull属性对应的是mybatis的CallSettersOnNulls属性,意思为如果列为null是否返回
- mybatis.pagehelper:这里配置的就是pagehelper的属性,它在mybatis下,同样与开发者实际项目中的pagehelper完全分离,配置属性互不影响
- poi.excel.importFilterEmptyRow:导入时是否启用过滤器,默认为false,目前过滤器只做了空行的过滤,也就是当你使用excel进行导入的时候,如果有空行,那么就会跳过这一行不进行导入动作,但有些特殊场景所插入的数据有可能存在空行,因此需要区别对待
- encrypt:加密处理,目前框架只支持国密非对称加密sm2,所以此处暂时只能写sm2,相对于国际标准的sha等sm2有更高的效率,更强的加密性,sm2也是国家推荐的加密方式,适用于很多国企项目。底层实现逻辑基于hutool工具,如果不配置则不使用加密,接下来用一个完整的示例顺便把如何加密解密也一起展示了,java代码如下:
public static void main(String[] args) throws Exception {String publicKey = "04a14dd8d62e90d5cfd7b59ce89e346e0e7def05281361f7ef47676c1e534ca85b3d88839b02e9b57b2818f46beeea4eb88a3e5abe429d0e866ddea9c8c7756f7a";String privateKey = "00f8d5d53f123f1a001403a27acb16b8408dff48f249b2ed7d2429b3394628bc36";ZSEncrypt.initSM2(publicKey, privateKey);String text = "{\r\n" + " \"rule\":{\r\n" + " \"actions\":[\r\n" + " {\r\n" + " \"name\": \"delete\",\r\n" + " \"delete\":{\r\n" + " \"class\":\"ZsTestPO\",\r\n" + " \"matches\": {\r\n" + " \"equal\": {\r\n" + " \"test_field\": [\"ppp\"]\r\n" + " }\r\n" + " }\r\n" + " }\r\n" + " }\r\n" + " ]\r\n" + " }\r\n" + "}";String encrypt = ZSEncrypt.sm2Encrypt(text);System.out.println(encrypt);System.out.println(ZSEncrypt.sm2Decrypt(encrypt));
}
ZSEncrypt位置在edi.rule.util包下,是一个工具类,如上代码所示,publicKey和privateKey可以通过ZSEncrypt类打印出来,代码片段如下:
public static void printSM2Key() {log.info("pubQKeyStr="+SM2Param.pubQKeyStr);log.info("prvDKeyStr="+SM2Param.prvDKeyStr);}private static class SM2Param {private static SM2 sm2;private static String pubQKeyStr;private static String prvDKeyStr;static {sm2 = SmUtil.sm2();sm2.setMode(SM2Engine.Mode.C1C3C2);pubQKeyStr = HexUtil.encodeHexStr(((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false));prvDKeyStr = HexUtil.encodeHexStr(BCUtil.encodeECPrivateKey(sm2.getPrivateKey()));}}
上面的publicKey和privateKey是生成出来后写入到配置文件中的,也就是我在最上面展示的配置文件中的sm2PublicKey属性和sm2PrivateKey属性。接下来是初始化对象,通过publicKey和privateKey调用ZSEncrypt.initSM2(publicKey, privateKey),然后是将上一篇的json的delete指令直接复制粘贴过来,通过ZSEncrypt.sm2Encrypt(text)进行加密打印,最后再将解密的文本打印出来,结果如下所示:
04CC788580480F26FAF1A84F759715AC586514CB448C970CACDB0F5364F77E9B0FD2AC8441AD15AD277AC376FF50A41B9B256232F4882840D628B024F805674E700354A85CB995F2769480A60B424050550368C21789C3BF373D3FE6054ACEE81ED2B5ACD5214AEE1BB420759FD16643EFFB6212293FA117515BA4963EDF97269FF1BA14AABBC8E486E327227F1F9EA1C17C0A88676AF946C50F873B47D337D430777981E6A5C2430A34D875B99705B07F66987FA26D212A3BCE7BF75754346010926AA80CEBCA538256631BCB3ACCF236E666FC5B0D96FAB2E33485CF1D3F7F801E0C36BE3775671FBE52382938BDA2F3265D02A430BA02357E7A0DC3F41DE01BEB09A158601BFBF94BBD52FE486C1A6C8193721C71E4FF81D26D1AA7677890FA0D7907A46EA6489DDFD6249DB2F9A111BE3EA1A34E908D626AC64DA7FD18547218EFEE9FBADFD2ADDE8901D35FD7C717FA0443F4710E7F6EAECF83D4418633C7FFDC596289300B79A6009671986F30F6AC4EDA47192ECC4F5E03000458117FBAEE35F97ACB17
{"rule":{"actions":[{"name": "delete","delete":{"class":"ZsTestPO","matches": {"equal": {"test_field": ["ppp"]}}}}]}
}
接下来我们把配置放开,重新启动,可以看到多了两行日志,sm2PublicKey和sm2PrivateKey,接下来我们将刚刚在main函数中打印出来的密文粘贴到postman中,如图所示
加密.png
这时点击发送,最终产生的sql与先前的delete一样
总结:关于可配置的项后续版本的更新中会逐步增加,至于有哪些可以配置的,可参考上面提到的edi.rule.config.JSRuleProperties这个类。