条件:

  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. vbox虚拟机复制&&虚拟机指定静态IP

    一.复制镜像(假设源镜像已经用桥接方式,可以访问互联网). 注意需要重新生成mac地址 二.复制完成,启动复制好的镜像(注意,此时的镜像无法联网) vi /etc/udev/rules.d/70-pe ...

  2. c语言学习笔记 关于double

    今天做了个简单的例子,由于没有使用正确的数据类型导致出错,下面是记录 #include <stdio.h> int main(void){ int i; double sum; doubl ...

  3. ArcSDE 10.0与ArcSDE10.1的又一个区别

    ArcSDE10.0 安装后直接在创建sde表空间和sde用户的时候创建了sde服务:而sde10.1可以直接先通过ArcMap10.1直连数据库,创建sde表空间.sde用户.然后在有必要的情况下再 ...

  4. PAT甲级——A1033 To Fill or Not to Fill

    With highways available, driving a car from Hangzhou to any other city is easy. But since the tank c ...

  5. Activiti实战04_简单流程

    在Activiti实战03_Hello World中我们介绍了一个中间没有任何任务的流程,实现了流程的部署与查阅,而在本章中,将会为流程添加任务节点,是流程能够像个流程,变得更加丰满起来. 在上一节的 ...

  6. 使用em为单位制作两列弹性布局

    一.DIV布局按照定位的方法分为:浮动方法(float),坐标定位方法(position),还有就是两者相结合的方法. 二.DIV布局按照定义单位的不同可分为:固定宽度布局.流体布局.弹性布局和混合布 ...

  7. day66test

    作业 1. 先有一下成绩单数据 scores = [ { name: 'Bob', math: 97, chinese: 89, english: 67 }, { name: 'Tom', math: ...

  8. JSP-案例-商品增删改

    商品的增删改查 1显示 部分代码 Dao public List<Product> findAllProduct() throws SQLException { QueryRunner r ...

  9. linux在线用户管理

    LINUX是个多用户系统,一旦连接到网络中,它可以同时为多个登录用户提供服务.系统管理员可以随时了解系统中有那些用户,用户都在进行什么操作. 1.查看该系统在线用户 系统管理员若想知道某一时刻用户的行 ...

  10. spring源码学习之容器的扩展(二)

    六 BeanFactory的后处理BeanFactory作为spring容器的基础,用于存放所有已经加载的bean,为了保证程序上的高扩展性,spring针对BeanFactory做了大量的扩展,比如 ...