java通过实体类组装报文
条件:
1.实体类字段名 首字母小写(java规范),再通过报文的需求,填充的时候做对应修改即可(正常报文首字母是大写的)!
2.假如xml标签首字母是小写,那么实体类就给大写,首字母是大写,那么实体类就给小写,然后通过转换完成
3.实体类中只能存在:实体类,list<实体类>集合,字段。 不能存在:hashMap<>,list<String> 原因:使用实体类封装报文,存在hashMap<>,list<String>不合理,String直接就应该是字段了
业务逻辑代码:
/**
* 报文组装类
* @Author:
* @Date:
*/
public class MessageAssembly { /**
* 测试 EC成员订购报文(发送)实体类 完成
* 问题:
* 1.业务文档修改版中
* 报文有:JoinECTime 标签,列表中不存在
* 列表有:ProdInfo --> SubsID 标签,报文中不存在
* @param
* @return
*/
@Test
public void test(){
//StringBuffer存储所有的<></>标签
StringBuffer sb = new StringBuffer(); //封装实体类对象(主类,下面多个子类 == 根节点,下面多个子节点)
//(以下是实体类结构,自行复制代码,反封装model即可)
ECMemberOrderInfoRequest eCMemberOrderInfoRequest = new ECMemberOrderInfoRequest();
MemInfo memInfo = new MemInfo();
memInfo.setOprSeq("33333333333");
memInfo.setRelOprSeq("33333333333");
memInfo.setOprTime("44444444");
memInfo.setOprCode("2222222222");
memInfo.setApplyChannel("111111111");
memInfo.setProdID("88888");
memInfo.setProdInstID("147258");
memInfo.setSubsID("789456");
memInfo.setProdInstEffTime("123456747");
memInfo.setProdInstExpTime("8852236");
ProdInfo prodInfo = new ProdInfo();
prodInfo.setProdID("eeeeeee");
prodInfo.setPkgProdID("SDDFFFFF");
prodInfo.setProdInstID("BGTTTT");
prodInfo.setProdInstEffTime("12345666");
prodInfo.setProdInstExpTime("144565787");
prodInfo.setOprType("85520256");
ProdAttrInfo prodAttrInfo = new ProdAttrInfo();
prodAttrInfo.setServiceID("14777231546");
prodAttrInfo.setAttrKey("12123457");
prodAttrInfo.setAttrValue("4568786999");
prodAttrInfo.setOprType("78985222366");
prodInfo.setProdAttrInfo(prodAttrInfo);
ServiceAttrInfo serviceAttrInfo = new ServiceAttrInfo();
AttrInfo attrInfo = new AttrInfo();
attrInfo.setAttrKey("1111");
attrInfo.setAttrValue("2222");
serviceAttrInfo.setAttrInfo(attrInfo);
List<AttrInfo> attrInfoList = new ArrayList<>();
AttrInfo a = new AttrInfo();
a.setAttrKey("zxsasdasd");
a.setAttrValue("sdfsdfsfsf");
AttrInfo b = new AttrInfo();
b.setAttrKey("ertretetet");
b.setAttrValue("yuttyututu");
AttrInfo c = new AttrInfo();
c.setAttrKey("jhghgjg");
c.setAttrValue("qweqweqe");
attrInfoList.add(a);
attrInfoList.add(b);
attrInfoList.add(c);
serviceAttrInfo.setAttrInfoList(attrInfoList);
prodInfo.setServiceAttrInfo(serviceAttrInfo);
prodInfo.setSubsID("12345678888");
memInfo.setProdInfo(prodInfo);
memInfo.setCustomerNumber("5995444");
memInfo.setECProdInstID("ssss");
memInfo.setECSubsID("fhdfgdgf");
memInfo.setProvinceID("tttttttt");
OtherInfo otherInfo = new OtherInfo();
otherInfo.setInfoCode("12345477");
otherInfo.setInfoValue("sdfsdfsdfs");
memInfo.setOtherInfo(otherInfo);
eCMemberOrderInfoRequest.setMemInfo(memInfo); getMessage(eCMemberOrderInfoRequest,sb);
System.out.println(sb.toString());
} /**
* 通过对象实体类生成报文主体
* 注:
* 实体类中只能存在:实体类,list<实体类>集合,字段
* 不能存在:hashMap<>,list<String>
* @param obj 实体类对象
* @param sb StringBuffer
* @Author:
* @Date:
*/
public void getMessage(Object obj,StringBuffer sb){
//首先判断当前对象的类型
String objTypeName = obj.getClass().getTypeName();
//如何使集合,就遍历集合
if("java.util.ArrayList".equals(objTypeName)){
List<Object> list = (List<Object>)obj;
for (Object o: list) {
//递归
getMessage(o,sb);
}
}else{ //否则就是对象
//添加当前对象前标签
sb.append("<"+obj.getClass().getSimpleName()+">");
//获取当前对象的类类型
Class clazz = obj.getClass();
//获取所有public方法
Field[] fields=obj.getClass().getDeclaredFields();
//遍历
for(int i=0;i<fields.length;i++){
try {
Method declaredMethod = clazz.getDeclaredMethod("get" + firstUppercase(fields[i].getName()), new Class[]{});
//调用当前数组中的方法,获取当前方法的返回值
Object invoke = declaredMethod.invoke(obj); Type type = declaredMethod.getAnnotatedReturnType().getType();
String typeName = type.getTypeName();
//判断返回值是String
if("java.lang.String".equals(typeName)){
//设置前标签
sb.append("<"+firstToUpperOrToLowercase(fields[i].getName()+">")); //首字母大写转小写,首字母小写转大写
//设置内容
sb.append(invoke.toString());
//设置后标签
sb.append("</"+firstToUpperOrToLowercase(fields[i].getName()+">")); //首字母大写转小写,首字母小写转大写
}else{
//递归
getMessage(invoke,sb);
}
} catch (Exception e) {
System.out.println(sb.toString());
e.printStackTrace();
}
}
//添加当前对象后标签
sb.append("</"+obj.getClass().getSimpleName()+">");
}
}
/**
* 首字母大写
* @return
*/
private String firstUppercase(String str){
str = (str.substring(0,1).toUpperCase())+str.substring(1);
return str;
}
/**
* 首字母大写转小写,首字母小写转大写
* @return
*/
private String firstToUpperOrToLowercase(String str){
//判断首字母是大写
if(str.substring(0,1).toUpperCase().equals(str.substring(0,1))){
str = (str.substring(0,1).toLowerCase())+str.substring(1); //转小写
}else{
str = (str.substring(0,1).toUpperCase())+str.substring(1); //转大写
}
return str;
}
}
java通过实体类组装报文的更多相关文章
- 将JSON数据转换成JAVA的实体类
思路:首先将JSON格式的数据转换成JSONObject,然后将JSONObject转换成Java的实体类(其中类属性包括List等类型) Java实体类: SearchFilter 类 1 publ ...
- 高速创建和mysql表相应的java domain实体类
今天创建了一个表有十几个字段,创建完之后必定要写一个与之相应的java domain实体类. 这不是反复的工作吗?为什么不先把这个表的全部的字段查出来,然后放到linux环境下,用sed工具在每一行的 ...
- java 获取实体类对象属性值的方法
在java中我们要获得实体类对象的属性,一般情况是将实体类中的属性私有化,然后再对外提供get()与set()方法,然后再获取实体类对象的属性的时候先把对象new出来,再用变量名.get()的方法得到 ...
- 【转】java遍历实体类的属性和数据类型以及属性值
和同学接了个外包的活,由于项目中很多地方要用到poi导出excel,而每次导出都要写很多相同的代码,因为poi的cell.setCellValue();每次设置的都是不同实体bean的属性值,导致代码 ...
- java遍历实体类的属性和数据类型以及属性值
遍历实体类的树形和数据类型一级属性值 /** * 遍历实体类的属性和数据类型以及属性值 * @param model * @throws NoSuchMethodException * @throws ...
- 【java】实体类中 Set<对象> 按照对象的某个字段对set排序
背景: User实体类 有个属性是 Set<PositionChange> 职位变更字段 如下: PositionChange实体类 有个属性是positionStartDate 什 ...
- Java代码实体类生成SQL语句(Java实体类转数据库)
有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...
- Java List实体类去重
版权声明:本文为博主原创文章,未经博主允许不得转载. List特点:元素有放入顺序,元素可重复 Map特点:元素按键值对存储,无放入顺序 Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入 ...
- java遍历实体类的属性和值
代码如下: 实体类: public class User implements Serializable { private static final long serialVersionUID = ...
随机推荐
- Django项目:CRM(客户关系管理系统)--68--58PerfectCRM实现king_admin批量生成上课记录
# kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...
- Joomla 随记
使用 joomla 开发好几个网站了,记录一下基础的东西吧~ 一.下载: 进入 joomla官网 下载: 二.安装 Joomla: 把下载好的 joomla 放到网站文件夹(图为wamp阿帕奇服务 ...
- (转载)My97 datepicker使用指南
这里先显示大家都可以看到的My97DatePicker的用法: WdatePicker日历控件使用方法(http://www.cnblogs.com/yuhanzhong/archive/2011/0 ...
- windows2008解决必须使用角色管理工具安装或配置 NET3.5 sp1问题
win2008系统安装网站环境系统的时候常常提示:必须使用角色管理工具 安装或配置microsoft.net framework 3.5 sp1 ,导致安装不成功. 原因在于windows2008系统 ...
- JDBC2 --- 获取数据库连接的方式二 --- 技术搬运工(尚硅谷)
/** * 方式二,对方式一的迭代 * 在如下的程序中,不出现第三方的api,使得程序具有更好的可移植性. * @throws Exception */ @Test public void testC ...
- TZOJ 3042 切蛋糕(并查集)
描述 KK是个心灵手巧的好姑娘,她做了一个大蛋糕请她的好朋友们来品尝.这个蛋糕分成n×n个正方形小格,每个小格包含一块水果.KK要把蛋糕切成若干块,显然她不会破坏任意一个小格.无聊的某同学在她切蛋糕时 ...
- vim编辑器操作①
Linux文本编辑器: 行编辑器:sed 全屏编辑器:nano,vi/vim 本文主要介绍说明vim编辑器的相关使用: 其有三种模式,即: 编辑模式(默认模式).插入模式(输入模式).末行模式(内置的 ...
- 安装mysql-workbench
sudo apt-get install mysql-workbench
- Redis源码解析:11RDB持久化
Redis的RDB持久化的相关功能主要是在src/rdb.c中实现的.RDB文件是具有一定编码格式的数据文件,因此src/rdb.c中大部分代码都是处理数据格式的问题. 一:RDB文件格式 上图就是一 ...
- 【html、CSS、javascript-13】前端框架Bootstrap
1.Bootstrap前端框架:包含css样式.js插件.图标等 http://www.bootcss.com/ 2.Font Awesome:非常全的图标大全 https://fontawesome ...