条件:

  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通过实体类组装报文的更多相关文章

  1. 将JSON数据转换成JAVA的实体类

    思路:首先将JSON格式的数据转换成JSONObject,然后将JSONObject转换成Java的实体类(其中类属性包括List等类型) Java实体类: SearchFilter 类 1 publ ...

  2. 高速创建和mysql表相应的java domain实体类

    今天创建了一个表有十几个字段,创建完之后必定要写一个与之相应的java domain实体类. 这不是反复的工作吗?为什么不先把这个表的全部的字段查出来,然后放到linux环境下,用sed工具在每一行的 ...

  3. java 获取实体类对象属性值的方法

    在java中我们要获得实体类对象的属性,一般情况是将实体类中的属性私有化,然后再对外提供get()与set()方法,然后再获取实体类对象的属性的时候先把对象new出来,再用变量名.get()的方法得到 ...

  4. 【转】java遍历实体类的属性和数据类型以及属性值

    和同学接了个外包的活,由于项目中很多地方要用到poi导出excel,而每次导出都要写很多相同的代码,因为poi的cell.setCellValue();每次设置的都是不同实体bean的属性值,导致代码 ...

  5. java遍历实体类的属性和数据类型以及属性值

    遍历实体类的树形和数据类型一级属性值 /** * 遍历实体类的属性和数据类型以及属性值 * @param model * @throws NoSuchMethodException * @throws ...

  6. 【java】实体类中 Set<对象> 按照对象的某个字段对set排序

    背景: User实体类 有个属性是 Set<PositionChange> 职位变更字段 如下: PositionChange实体类  有个属性是positionStartDate   什 ...

  7. Java代码实体类生成SQL语句(Java实体类转数据库)

    有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...

  8. Java List实体类去重

    版权声明:本文为博主原创文章,未经博主允许不得转载. List特点:元素有放入顺序,元素可重复 Map特点:元素按键值对存储,无放入顺序 Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入 ...

  9. java遍历实体类的属性和值

    代码如下: 实体类: public class User implements Serializable { private static final long serialVersionUID = ...

随机推荐

  1. Django项目:CRM(客户关系管理系统)--83--73PerfectCRM实现CRM模板统一

    {#king_index.html#} {## ————————73PerfectCRM实现CRM模板统一————————#} {% extends "master/sample.html& ...

  2. 你所不知道的Mac截图的强大

    Mac的截图功能扩展功能很强大的,不要用QQ那个COM+Ctrl+A弱爆了的截图了~ 首先说一下两种截图 1.Command+shift+3:全屏截图,保存截图到桌面 2.Command+shift+ ...

  3. oauth2使用心得-----基本概念以及认证服务器搭建

    应用场景 我们假设你有一个“云笔记”产品,并提供了“云笔记服务”和“云相册服务”,此时用户需要在不同的设备(PC.Android.iPhone.TV.Watch)上去访问这些“资源”(笔记,图片) 那 ...

  4. D - Tree and Hamilton Path

    题意 给一棵树,问一个排列,使得按顺序走过这些点的路径最长. N<=100000 解法 为了能让每条边被经过的次数达到上界, 我们首先找出重心, 然后容易得出一种排列方案,使得答案为以重心为根的 ...

  5. 移动端自动化测试Appium 从入门到项目实战Python版

    移动端自动化测试Appium 从入门到项目实战Python版  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...

  6. jmeter参数化之用户自定义变量

    1.     用badboby进行录制,录制完成后保存,用JMeter格式进行保存,如:登陆.jmx 2.     在jmeter中打开保存的文件登陆.jmx. 3.线程组右击-添加-配置元件-用户定 ...

  7. apk反编译(6)用ProGuard 混淆、压缩代码,压缩资源。

    1.android官方文档 https://developer.android.com/studio/build/shrink-code  主要内容如下: 1.1 压缩代码 混淆生成的文件:<m ...

  8. vim 简明教程(转自飘过的小牛)

    vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...

  9. JS---案例:无刷新评论---属于创建对象的案例拿出来复习

    案例:无刷新评论---属于创建对象的案例拿出来复习 创建行和单元格,添加到相应元素中,设置内容 createElement, appendChild,innerHTML <!DOCTYPE ht ...

  10. ES6 promise 封装http请求

    今天研究了一下同事封装的http请求,用的是promise. 大结构是: const __fetch = (url, data = {}, config = {}) => { let param ...