java接口入参模板化,适用于企业化服务远程调度模板化的场景,接口入参实现高度可配置化
需求:远程服务接口模板化配置提供接入服务

模板接口分为三个模块:功能路由、参数校验、模板入库
路由:这里的实现方式很简单,就是根据业务标识找到对应的处理方法
参数校验:
参数校验这步涉及模板和校验类两个核心模块
提供一个表设计:
CREATE TABLE `account_template_validation` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`city_no` VARCHAR(50) NOT NULL COMMENT '城市编码',
`template_id` VARCHAR(64) NOT NULL COMMENT '模板id',
`properties` VARCHAR(4000) NOT NULL COMMENT '模板',
`isReturn` VARCHAR(10) NOT NULL COMMENT '是否要跳转',
`create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
`update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
INDEX `cityNo` (`city_no`),
INDEX `templateId` (`template_id`)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
模板表模板的值需要用到json格式的报文:
{
"A": {
"notNull": "false",
"length": "15",
"toFiled": "B"
},
"A": {
"notNull": "false",
"length": "15",
"toFiled": "C"
},
"gmt_time": {
"notNull": "false",
"length": "15",
"toFiled": "gmtTime",
"formate": "((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229))([0-1][0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$"
}
}
模板的报文是包含入参字段配置的属性
核心校验类:
public static void main(String[] args) {
JSONObject template = JSON.parseObject("{\"si_type\":{\"notNull\":\"true\",\"length\":\"32\",\"toFiled\":\"siType\"},\"account_balance\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"accountBalance\"},\"pay_cost_base\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"payCostBase\"},\"pay_cost_month\":{\"notNull\":\"true\",\"length\":\"6\",\"toFiled\":\"payCostMonth\"},\"pay_cost_total\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"payCostTotal\"},\"pay_cost_person\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"payCostPerson\"},\"pay_cost_unit\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"payCostUnit\"},\"account_person\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"accountPerson\"},\"extend_params_test1\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"extend_params\"},\"extend_params_test2\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"extend_params\"}}");
JSONObject sourceObject = JSON.parseObject("{\"biz_type\":\"si_payment_incomeS\",\"city_code\":\"330100\",\"sys_service_provider_id\":\"2088101010464092\",\"si_data\":[{\"target_idcard_type\":\"01\",\"request_id\":\"201901311817129355\",\"target_idcard\":\"4453231994089898631\",\"target_user_name\":\"张三\",\"target_user_id\":\"2088102122001010\",\"target_sicard_no\":\"M40000240\",\"target_extend_params\":\"{}\",\"mobile\":\"18100000000\",\"template_id\":\"XS_si_payment_income_template\",\"template_version\":\"1.0\",\"template_data\":[{\"account_balance\":\"0\",\"account_person\":\"40\",\"pay_cost_month\":\"195504\",\"pay_cost_base\":\"2500\",\"pay_cost_total\":\"195\",\"pay_cost_person\":\"195\",\"pay_cost_unit\":\"1955\",\"extend_params\":\"{}\",\"si_type\":\"10\"},{\"account_balance\":\"0\",\"account_person\":\"40\",\"pay_cost_month\":\"195504\",\"pay_cost_base\":\"2500\",\"pay_cost_total\":\"195\",\"pay_cost_person\":\"195\",\"pay_cost_unit\":\"1955\",\"extend_params\":\"{}\",\"si_type\":\"20\"},{\"account_balance\":\"0\",\"account_person\":\"40\",\"pay_cost_month\":\"195504\",\"pay_cost_base\":\"2500\",\"pay_cost_total\":\"195\",\"pay_cost_person\":\"195\",\"pay_cost_unit\":\"1955\",\"extend_params\":\"{}\",\"si_type\":\"30\"},{\"account_balance\":\"0\",\"account_person\":\"40\",\"pay_cost_month\":\"195504\",\"pay_cost_base\":\"2500\",\"pay_cost_total\":\"195\",\"pay_cost_person\":\"195\",\"pay_cost_unit\":\"1955\",\"extend_params\":\"{}\",\"si_type\":\"40\"}],\"service_return_url\":\"https://www.alipay.com\"}],\"extend_params\":\"{}\",\"target_notify_time\":\"20181226151421\"}");
*//**
* 开始校验数据
* 需要校验数据的长度,是否必传,是否满足正则表达式规则.
*//*
String siArry = sourceObject.getString("si_data");
JSONArray siarr = JSON.parseArray(siArry);
for (Object object : siarr) {
String siData = object == null ? "" : String.valueOf(object);
JSONObject siObject = JSON.parseObject(siData);
String tempdataArry = siObject.getString("template_data");
JSONArray tempdataarr = JSON.parseArray(tempdataArry);
for (Object object2 : tempdataarr) {
String tempData = object2 == null ? "" : String.valueOf(object2);
JSONObject tempObject = JSON.parseObject(tempData);
Set<Entry<String, Object>> entrySet = tempObject.entrySet();
for (Entry<String, Object> entry : entrySet) {
String key = entry.getKey();
Object value = entry.getValue();
System.out.println(key+"---------"+value);
TemplateValidate templateValidator = JSON.parseObject((String) template.getString(key), TemplateValidate.class);
System.out.println(templateValidator);
//判断是否为空
if ("true".equals(templateValidator.getNotNull())) {
if (value == null) {
System.out.println("{0},校验失败!不能为null!");
LoggerUtil.info(logger, "{0},校验失败!不能为null!", key);
} else if (StringUtil.isBlank(String.valueOf(value))) {
System.out.println("{0},校验失败!不能为null!");
LoggerUtil.info(logger, "{0},校验失败!不能为null!", key);
}
}
//判断长度是否超过规定值
Integer length = Integer.parseInt(templateValidator.getLength());
if (((String) value).length() > length) {
System.out.println("{0},校验失败!长度超长!");
LoggerUtil.info(logger, "{0},校验失败!长度超长!", key);
}
//判断格式是否正确
if (StringUtil.isNotBlank(templateValidator.getFormate())) {
if (!Pattern.matches(templateValidator.getFormate(), String.valueOf(value))) {
LoggerUtil.info(logger, "{0},校验失败!格式不匹配!", key);
}
}
}
}
}
}
class TemplateValidate {
private String toFiled;
private String notNull;
private String length;
private String formate;
public String getToFiled() {
return toFiled;
}
public void setToFiled(String toFiled) {
this.toFiled = toFiled;
}
public String getNotNull() {
return notNull;
}
public void setNotNull(String notNull) {
this.notNull = notNull;
}
public String getLength() {
return length;
}
public void setLength(String length) {
this.length = length;
}
public String getFormate() {
return formate;
}
public void setFormate(String formate) {
this.formate = formate;
}
}
模板参数组装:
public static void main(String[] args) {
JSONObject template = JSON.parseObject(
"{\"si_type\":{\"notNull\":\"true\",\"length\":\"32\",\"toFiled\":\"si_type\",\"formate\":\"[12345]0\"},\"account_balance\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"account_balance\"},\"pay_cost_base\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"pay_cost_base\"},\"month\":{\"notNull\":\"true\",\"length\":\"6\",\"toFiled\":\"pay_cost_month\",\"formate\":\"(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})((0[13578]|1[02])|(0[469]|11)|02))\"},\"pay_cost_total\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"pay_cost_total\"},\"pay_cost_person\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"pay_cost_person\"},\"pay_cost_unit\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"pay_cost_unit\"},\"account_person\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"account_person\"},\"extend_params\":{\"notNull\":\"false\",\"length\":\"15\",\"toFiled\":\"extend_params\"}}");
JSONObject sourceObject = JSON.parseObject(
"{\"biz_type\":\"si_payment_incomeS\",\"city_code\":\"330100\",\"sys_service_provider_id\":\"2088101010464092\",\"si_data\":[{\"target_idcard_type\":\"01\",\"request_id\":\"201902011759182132\",\"target_idcard\":\"445323199404211217\",\"target_user_name\":\"张三\",\"target_user_id\":\"2088102122001010\",\"target_sicard_no\":\"M40000240\",\"target_extend_params\":\"{}\",\"mobile\":\"18100000000\",\"template_id\":\"XS_si_payment_income_template\",\"template_version\":\"1.0\",\"template_data\":[{\"account_balance\":\"0\",\"account_person\":\"50\",\"month\":\"201902\",\"pay_cost_base\":\"2500\",\"pay_cost_total\":\"195\",\"pay_cost_person\":\"195\",\"pay_cost_unit\":\"1955\",\"extend_params\":\"{}\",\"si_type\":\"10\"},{\"account_balance\":\"0\",\"account_person\":\"40\",\"month\":\"201902\",\"pay_cost_base\":\"2500\",\"pay_cost_total\":\"195\",\"pay_cost_person\":\"195\",\"pay_cost_unit\":\"1955\",\"extend_params\":\"{}\",\"si_type\":\"20\"},{\"account_balance\":\"0\",\"account_person\":\"40\",\"month\":\"201902\",\"pay_cost_base\":\"2500\",\"pay_cost_total\":\"195\",\"pay_cost_person\":\"195\",\"pay_cost_unit\":\"1955\",\"extend_params\":\"{}\",\"si_type\":\"30\"},{\"account_balance\":\"0\",\"account_person\":\"40\",\"month\":\"201902\",\"pay_cost_base\":\"2500\",\"pay_cost_total\":\"195\",\"pay_cost_person\":\"195\",\"pay_cost_unit\":\"1955\",\"extend_params\":\"{}\",\"si_type\":\"40\"}],\"service_return_url\":\"https://www.alipay.com\"}],\"extend_params\":\"{}\",\"target_notify_time\":\"20181226151421\"}");
String siArry = sourceObject.getString("si_data");
sourceObject.remove("si_data");
JSONArray siarr = JSON.parseArray(siArry);
JSONArray toSiArr=new JSONArray();
for (Object object : siarr) {
String siData = object == null ? "" : String.valueOf(object);
JSONObject siObject = JSON.parseObject(siData);
String tempdataArry = siObject.getString("template_data");
JSONArray tempdataarr = JSON.parseArray(tempdataArry);
JSONArray totempdataarr = new JSONArray();
for (Object objecttemp : tempdataarr) {
String tempData = objecttemp == null ? "" : String.valueOf(objecttemp);
JSONObject tempObject = JSON.parseObject(tempData);
JSONObject toObject = new JSONObject();
Set<Entry<String, Object>> entrySet = tempObject.entrySet();
for (Entry<String, Object> entry : entrySet) {
String key = entry.getKey();
Object value = entry.getValue();
TemplateValidate templateValidator = JSON.parseObject((String) template.getString(key), TemplateValidate.class);
if ("extend_params".equals(templateValidator.getToFiled())) {
toObject.put(
"extendParams",
(toObject.getString("extendParams") == null ? "" : toObject.getString("extendParams")) + "{\"" + key + "\":\"" + value
+ "\"}");
}
toObject.put(templateValidator.getToFiled(), value);
}
totempdataarr.add(toObject);
}
siObject.remove("template_data");
siObject.put("template_data", totempdataarr);
toSiArr.add(siObject);
}
sourceObject.put("si_data", toSiArr);
SiAccountIncomeRequestBodyVO requestVO = JSON.toJavaObject(sourceObject, SiAccountIncomeRequestBodyVO.class);
System.out.println(requestVO);
handel(requestVO);//处理业务,后续落库
}
java接口入参模板化,适用于企业化服务远程调度模板化的场景,接口入参实现高度可配置化的更多相关文章
- 使用yaml+groovy实现Java代码可配置化
背景与目标 在使用函数接口和枚举实现配置式编程(Java与Scala实现),使用了函数接口和枚举实现了配置式编程.读者可先阅读此文,再来阅读本文. 有时,需要将一些业务逻辑,使用配置化的方式抽离出来, ...
- Vue + webpack 项目配置化、接口请求统一管理
准备工作 需求由来: 当项目越来越大的时候提高项目运行编译速度.压缩代码体积.项目维护.bug修复......等等成为不得不考虑而且不得不做的问题. 又或者后面其他同事接手你的模块,或者改你的bug ...
- 16个时髦的扁平化设计的 HTML5 & CSS3 网站模板
创建网站最好办法之一是使用现成的网站模板或使用开源 CMS 应用程序.所以,今天这篇文章给大家带来的是16款基于 HTML5 & CSS3 的精美的扁平风格网站模板,大家可以借助这些优秀的网站 ...
- java 微信公众服务平台 下发 模板消息
java 微信公众服务平台 下发 模板消息 (一).部分截图 (二).部分代码 (一).部分截图: (二).部分代码: //此处 给用户微信发消息... Map<String,String> ...
- Java反射机制demo(四)—获取一个类的父类和实现的接口
Java反射机制demo(四)—获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的getSuperClass()方法能够得到一个类的父类 如果此 Class 表示 ...
- JAVA经常使用集合框架使用方法具体解释基础篇二之Colletion子接口List
接着上一篇,接着讲讲集合的知识.上一篇讲了Collection接口.它能够说是集合的祖先了,我们这一篇就说说它的子孙们. 一.Collection的子接口 List:有序(存入和取出的顺序一致).元素 ...
- java 面向对象面试题,问答题,构造方法,抽象类,继承,多态,接口,异常总结;
一,构造方法的特点 面向对象的思想是如何在java展现的呢? 就是通过类和对象 类是一组相关的属性和行为的集合.是一个抽象的概念. 对象是该类事物的具体表现形式.具体存在的个体. 一.抽象类的抽象方法 ...
- 【Java EE 学习 57】【酒店会员管理系统之分页模板书写】
分页一直是一个比较麻烦的问题,特别是在我做的这个系统中更是有大量的分页,为了应对该问题,特地写了一个模板以方便代码重用,该模板包括后台分页的模板.前端显示的模板两部分. 一.分页分析 分页需要三种类型 ...
- Java第4次实验提纲(面向对象2-继承、多态、抽象类与接口与Swing)
PTA 题集面向对象2-进阶-多态接口内部类 第1次实验 1.1 题集5-1(Comparable) 难点:如果传入对象为null,或者传入对象的某个属性为null,怎么处理? 1.2 题集5-2(C ...
随机推荐
- 洛谷P4396 作业 [AHOI2013] 莫队
正解:莫队 解题报告: 传送门! 天呐太久没做莫队了连板子都认不出来了,,,所以复健下做下莫队的题目QAQ 就很板子鸭,和莫队板子比好像只有一个离散化,,,?就不讲了QAQ 等下直接放代码QAQ ov ...
- dict()的另一种用法
先了解两个内容: 定义字典的两种方法: d1 = { ‘name’ :‘zzl’} #方法一 d2 = dict( name = 'zzl' ) #方法二 2. __dict__()方法不记录类的属性 ...
- MySQL的分区、分表、集群
1.分区 mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一 ...
- outlook2016用Exchange轻松绑定腾讯企业邮箱
系统版本:Win10 X64 1709 英文版 邮箱:Outlook2016 背景知识: 1.发送邮件均使用SMTP协议(SMTP 全称“Simple Mail Transfer Protocol”, ...
- 这10个Python项目超有趣!
前言: Python可谓是现在很多人正在学或者想学的一个脚本语言了,提到学习自然就少不了拿项目练手,可是一般的项目根本提不起兴趣嘛,这10个项目可是非常有趣的,不信你看看. [Python 图片转字符 ...
- std::bind学习
std::bind bind是对C++98标准中函数适配器bind1st/bind2nd的泛化和增强,可以适配任意的可调用对象,包括函数指针.函数引用.成员函数指针和函数对象. bind接受的第一个参 ...
- 构建 Owin 中间件 来获取客户端IP地址
Not so long ago, we discussed on this blog the possible ways of retrieving the client’s IP address i ...
- Key in_hidden/batch_normalization/beta not found in checkpoint
可能原因:不同参数的结果保存到了同一文件夹下 解决方法:不同参数结果放在不同的checkpoints tf.train.Saver().save(sess, self.checkpoint_dir + ...
- centos crash debug
https://www.dedoimedo.com/computers/crash.html#mozTocId484074 http://people.redhat.com/anderson/cras ...
- Win10问题
WIN10去除我的电脑上面的6个文件夹 把下面代码复制,保存到.reg中,然后执行即可(修改注册表文件.reg) Windows Registry Editor Version 5.00 ;如需还原去 ...