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 = ...
随机推荐
- jeecms 配置可以低级别用户流程
使用管理员admin登录后台,进入用户—>管理员(本站)à添加,填写用户名.密码等信息,如下图: 需要注意几个权限控制的问题: 1, 等级,值越大等级越高,等级高的管理员可以审核等级低的管理员 ...
- mysql利用MySQLWorkbench生成数据表之间的关系图
先看结果,默认是展开的,我手动把表折叠了 那么如何实现呢 先点击这里 然后通过向导来创建即可,一直到finish就行了
- 使用jstl el表达式对form表单的功能进行区分 比如新建和修改共用一个form
新建一个专栏,修改这个专栏信息 完全可以做在一个jsp的一个form中 但是,需要注意的是,使用mvc的对象属性自动封装的话 如果id为空,将会报错,无法进入controller中的 所以要在页面上判 ...
- Python学习之列表--自动超市购物车
效果图: 实现代码: menu = [0,5000,500,9000,3000,30,50,7000,70,40]name = [0,"iphone","bicycle& ...
- Leetcode504.Base 7七进制数
给定一个整数,将其转化为7进制,并以字符串形式输出. 示例 1: 输入: 100 输出: "202" 示例 2: 输入: -7 输出: "-10" 注意: 输入 ...
- springboot框架实现启动项目执行指定代码
说明: 当有写代码需要在项目启动时执行的时候(即项目启动完成前),可以使用这个方法. 步骤: 创建一个启动类并在类上打上@Component注解 让这个类实现CommandLineRunner接口 重 ...
- 《2018年云上挖矿态势分析报告》发布,非Web类应用安全风险需重点关注
近日,阿里云安全团队发布了<2018年云上挖矿分析报告>.该报告以阿里云2018年的攻防数据为基础,对恶意挖矿态势进行了分析,并为个人和企业提出了合理的安全防护建议. 报告指出,尽管加密货 ...
- 基于RBAC权限管理的后台管理系统
在摸爬滚打中渐渐理解了RBAC权限管理是个什么玩意. RBAC的基本概念: **RBAC认为权限授权实际上是Who.What.How的问题.在RBAC模型中,who.what.how构成了访问权限三元 ...
- ngVerify - 更高效的 angular 表单验证
ngVerify v1.5.0 a easy Angular Form Validation plugin.简洁高效的__angular表单验证插件__ See how powerful it.看看它 ...
- jquery 点击图片弹出遮罩层查看大图
<div class="photobox"> <ul> <li data-date="'+data[i].id+'"> &l ...