条件:

  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. Yaf--个人封装yaf的框架+swoole+elasticsearch(Window+linux版)

    这是基于c写底层的yaf框架集成PDO+predis+读写分离+composer+全局异常处理+多模块开发+Log日志记录简单容易上手的框架 注意:window版没有swoole和Smarty主要用作 ...

  2. Error-SQLServer:【失败】win7装SQL server2017

    ylbtech-Error-SQLServer:[失败]win7装SQL server2017 1.返回顶部 1. 2018年08月15日 22:06:38 USCWIFI 阅读数:5433    版 ...

  3. java 用户注册登陆Demo

    一个用户注册登陆的系统,用到了MD5加密处理密码,实现了一个简单的数据库连接池connectionPool, 实现了注册,登陆,登陆之后修改用户信息等功能,非常适合初学者 一.准备工作 数据库:MyS ...

  4. 原生js实现头像大屏随机显示

    效果如下图所示: 一.html部分 <div class="myContainer"> <ul> <li class="first" ...

  5. 两天了。照着SVN的界面画的一个界面。

      可以选择显示哪些列. 界面上的东西,都简单,麻烦的是它的下层.下层全部用svn server的服务器自带的svn.exe来支持. 有些位置要启动svn.exe不止一次.所以参数的来回传递,来回组合 ...

  6. 移植别人的vcpkg包到自己的项目

    修改该目录下的文件即可: 或者修改你的项目文件下的所有不对的路径,类似于这种:

  7. id 工具: 查询用户所对应的UID 和GID 及GID所对应的用户组

    id 工具是用来查询用户信息,比如用户所归属的用户组,UID 和GID等:id 用法极为简单:我们举个例子说明一下: 语法格式: id  [参数]  [用户名] 至于有哪些参数,自己查一下 id -- ...

  8. 【vue】openshopping-vue

    这是一个基于Vue实现开箱即用H5移动端商城的单页应用 作者的开源地址是:https://github.com/yrinleung/openshopping-vue 我们一起来欣赏页面吧 看看代码有什 ...

  9. CSS作业问题 内容回顾

    CSS作业问题 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  10. Kubernetes 基于 ubuntu18.04 手工部署 (k8s)

    由于工作的需要, 手工部署一个 Kubernetes 环境(k8s).(以前都是云上搞定,拿来用) 习惯把这种工作记录下来,自己备查也和别人分享 网上相关文章很多, 我也参考了很多,这里推荐一个 链接 ...