- 文档目的
更多资料下载请点--> 蓝凌开发资料大全
本文档用于描述蓝凌V16产品架构变更及新增机制的开发部署规范及要求,以方便开发人员快速使用新版本提供的能力,文档面向的主要人群为java开发人员。
- 开发部署说明
- 新增开发规约
-
- 以及日志框架变化
-
- 新增开发规约
SLF4J + Logback
原因:统一日志门面,logback日志比log4j更新,写日志的效率更高,更友好、更稳定;
升级后请按照日志书写格式打印日志;
${project}src/Logback.xml日志路径, ${project}src/log4j.properties文件已删除;
配置EKP 输出日志路径 <property name="logPath" value="." />
之前不规范书写例子:
1.logger.info(curTimeItem);
2.import java.util.logging.Logger;
3.java.util.logging.LoggerFactory.getLogger(SearcherService2WSAPI.class.getName())
.log(java.util.logging.Level.INFO,
"Can not initialize the default wsdl from {0}", "file:webcontent/wsdl/SearcherServiceWSAPI2.wsdl");
4.log.error(e) e为Exception e,现在是log.error(String),应该是:log.error(“xxxx {}”,e);
5.org.slf4j.LoggerFactory.getLogger(FsBaseImageParsePools.class.getName()).log(Level.SEVERE, null,ex);
-
-
-
- Hibernate 开发规范
-
-
参数占位符
HQL级联对象查询
自我关联表HQL
多对多条件为对象情况 *
获取Hibernate 的 session
*Dao 中获取加方法,直接 super.getSession(),实际上获取到是线程绑定事务的session, 调的是getSessionFactory().getCurrentSession();
在线程中获取 Hibernate 的 session 需要加事务;
其他地方获取 session :
KmssSessionFactoryProxy kmssSessionFactoryProxy = (KmssSessionFactoryProxy)SpringBeanUtil.getApplicationContext().getBean("sessionFactory");
Session session = kmssSessionFactoryProxy.openSession();
获取 hibernate 其他信息可以通过类src/com/landray/kmss/sys/hibernate/spi/HibernateWrapper.java
HibernateTemplate.saveOrUpdateAll()废除,解决方式:使用 com.landray.kmss.sys.hibernate.spi.HibernateWrapper.saveOrUpdateAll 替换
获取数据库连接通过类 src/com/landray/kmss/sys/hibernate/spi/ConnectionWrapper.java,获取到connection 使用后,记得关闭。
获取 Hibernate 的 Connection需要加事务
HQL 查询语句的问题 - 如何定位?
如果是报HQL 语法错误,可以通过访问EKP链接来检查HQL是否正确,修正后再次提交检查
http://localhost:8080/ekp/trans/to_sql?hql=你的HQL,提交翻译时HQL不能带占位符,
通过打断点,打再这三个类:KmssASTQueryTranslatorFactory , HQLConverTool ,HQLQueryPlan,QueryPlanCache
- KmssASTQueryTranslatorFactory 这个是HQL翻译工程类,用来创建QueryTranslatorImpl
- HQLConverTool 是做之前HQL的兼容性转换
- HQLQueryPlan 可以查看HQL翻译出来的SQL
- QueryPlanCache 可以查看HQL是否是从Hibernate缓存取
-
-
-
- Spring 注入循环依赖问题
-
-
Spring 注入循环依赖问题,报异常:FactoryBean which is currently in creation returned null from getObject
例子:/src/com/landray/kmss/kms/reminder/service/spring/KmsReminderDetailServiceImp.java
需要解除EKP 启动的时候 spring.xml 依赖注入,修改为运行时硬编码方式初始化实例:
-
-
-
- 关于Spring-Session的开发规约
-
-
spring-session 升级,存储策略为Redis存储,升级后,EKP中的HttpSession对象在每次请求开始时从Redis读取创建会话,请求结束时将当前会话信息存储到Redis,应酌情避免将非会话相关的内容存储到httpSession中;详细请参见附件
-
-
-
- 其他规约
-
-
- 访问资源,URL不规范,比如:URL带有双//斜线;
- 注意升级Hibernate 后,有些场景的HQL使用 INNER JOIN 查询满足不了业务,需要修改为LEFT JOIN;
- 日志规范,使用 org.slf4j.Logger + org.slf4j.LoggerFactory 打印日志;或者使用ExceptionUtils.printRootCauseStackTrace(e)方式打印异常堆栈;
- 尽量不要使用 System.out.print()/println()
- 不能使用log4j等其他日志框架;
-
- E签宝部署说明
签署能力新增了E签宝本地化签署和E签宝SaaS签署两种能力,在ELEC-008模块中对ELEC-009的上传合同接口,下载合同接口,获取合同签署链接接口进行实现。再由ELEC-008模块进行具体服务能力(本地化或SaaS)的调用。业务模块仍旧通过ELEC-009的相关接口调用签署服务。
具体要求如下:
-
-
- 模块关联
-
-
-
- 本地化服务配置规范
-
根据模块关联,需要组装ELEC-030、ELEC-008、ELEC-009、ELEC-012模块。
sys后台-集成管理-电子合同集成-E签宝,打开配置开关,输入接口相关配置信息并保存。如图: sys后台-组织权限管理-基础设置-自定义设置-人员卡片自定义
新建证件类型字段(请与人员同步字段设置中取名保持一致,枚举类型严格按照图中枚举)
新建证件号码字段(请与人员同步字段设置中取名保持一致)
sys后台-组织权限管理-基础设置-自定义设置-机构卡片自定义
新建证件类型字段(请与机构同步字段设置中取名保持一致,枚举类型严格按照图中枚举)
新建证件号码字段(请与机构同步字段设置中取名保持一致)
-
-
- 本地化服务开发规范
-
1、 业务模块调用发起签署的接口
2、 业务模块配置扩展点plugin.xml,并添加一个excute方法处理回调事件。
通过扩展点调用接口:
uploadContract这个方法需要封装两个入参,其中,contractSignInfo是签署任务的主要信息,包括签署文件、签署人员列表等信息,additionalInfo是附加信息。
additionalInfo的Keyword1和Keyword2分别传入业务模块的modelName和modelId,用于后面回调定位。
具体参数可以参考合同管理模块,KmAgreementEqbSignServiceImp. send ()。
回调处理:
修改plugin.xml;添加回调的Bean配置,如下,修改bean的value、receiver的value(与附加信息additionalInfo的Keyword1值保持一致)其他不改:
<!-- e签宝回调业务处理 --> <extension point="com.landray.kmss.elec.device.ansyService" model="com.landray.kmss.elec.device.client.IElecChannelRequestMessage"> <item name="convertor"> <param name="bean" value="kmAgreementEqbSignService" /> <param name="channel" value="eqb" /> <param name="receiver" value="com.landray.kmss.km.agreement.model.KmAgreementSign" /> </item> </extension> |
并在spring.xml注册该bean。
增加一个service类实现IElecChannelAnsyService接口,重写execute方法。其中,入参即为E签宝返回的相关信息,是个json数据,包含了触发回调的签署人和签署状态,签署文件,下一签署人等信息。详细参数信息可查看E签宝接口文档:
{ "modelName": "", "modelId": "", "reqBody": { "action": "SIGN_FLOW_FINISH", "createTime": "2020-09-21 19:17:29", "endTime": "2020-09-21 19:17:42", "flowId": 54991, "flowType": "Common", "resultDescription": "签署成功", "status": 2, "finishDocUrlBeans": [ { "docFileKey": "$3da1d7b8-d669-4ce0-8d30-341ed9e9ed8b$3299301402", "downloadDocUrl": "https://testesignpro.tsign.cn:6443/esignproweb/rest/filesystem/operation/download?fileKey=$4ef50af7-af89-45ca-952c-9a5a088fcbcb$3547147904&signature=Jrq%2FJ4KCKCx1uwDqCn%2F0VMRso8o%3D%0A&expire=1603279062323", "finishFileKey": "$4ef50af7-af89-45ca-952c-9a5a088fcbcb$3547147904" }, { "docFileKey": "$3da1d7b8-d669-4ce0-8d30-341ed9e9ed8b$3299301402", "downloadDocUrl": "https://testesignpro.tsign.cn:6443/esignproweb/rest/filesystem/operation/download?fileKey=$4ef50af7-af89-45ca-952c-9a5a088fcbcb$3547147904&signature=Jrq%2FJ4KCKCx1uwDqCn%2F0VMRso8o%3D%0A&expire=1603279062323", "finishFileKey": "$4ef50af7-af89-45ca-952c-9a5a088fcbcb$3547147904" } ], "accountInfo": { "accountId": "e80c2525-9b48-4151-9b3d-1edd4a6e5b98", "accountUid": "lhuser002", "name": "张二", "type": 1 }, "waitingToSignAccount": [ { "accountId": "e80c2525-9b48-4151-9b3d-1edd4a6e5b98", "accountUid": "lhuser002", "name": "张二", "type": 1 } ] } } |
创建签署流程时,会把前面配置的回调地址作为签署流程的回调地址传入。业务模块可以根据入参判断是哪个事件并做相应处理。回调处理可以参考合同管理模块,KmAgreementEqbSignServiceImp.execute方法。