• 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;
        }
    }
  • 相关阅读:
    js代码性能优化的几个方法
    BOM(浏览器对象模型)的一些内置对象总结
    js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
    ELF文件格式
    Python 语言之 map/reduce
    LeetCode
    快速排序
    网络问题诊断
    Notepad++ 用法技巧
    Python图形开发之PIL
  • 原文地址:https://www.cnblogs.com/mh-study/p/9952474.html
Copyright © 2020-2023  润新知