银联报文解析

问题描述

写了一个公用的beanutils对象复制工具类,传入两个字符串得到两个模型,一个成功复制,另一个复制后值全为null
两个字符串分别为:

String a="{F0=0200&F25=00&F3=000000&F37=171101171258&F60=030000000000700100000000027001000}";
String q="{id=777290058135880&merCatCode=5811&name=商户名称&termId=49000002}";

公共方法为:

public  static  T convObject(String comInfo, Class cls) throws IllegalAccessException, InvocationTargetException, InstantiationException, IntrospectionException {
String res=comInfo.substring(1,comInfo.length()-1);
        Map m = new HashMap();
        String[] strs =res.split("&");
        for(Strings:strs){
        String[] ms = s.split("=");
        m.put(ms[0],ms[1]);
        }
        T obj = cls.newInstance();
        BeanUtils.copyProperties(obj,m);
        System.out.println(m);
        System.out.println(obj);
returnobj;
}

得到的结果分别为:

{F60=030000000000700100000000027001000, F25=00, F0=0200, F37=171101171258, F3=000000}
ComInfoBO [F0=null, F3=null, F25=null, F37=null, F60=null]
{termId=49000002, name=商户名称, id=777290058135880, merCatCode=5811}
PayeeInfoBO [merCatCode=5811, id=777290058135880, name=商户名称, termId=49000002]

原因分析


银联报文解析_第1张图片
这里写图片描述
银联报文解析_第2张图片
银联报文解析_第3张图片
银联报文解析_第4张图片
银联报文解析_第5张图片
可以发现,用这个方法取到的键为60而字符串中的键为F60,然后我进行了一个小测试,如果将字符串a中的F全部改为f那么这个对象复制是不会出现问题.pd 中的basename还是正确的,为什么getName得到的就是变小写了呢?想在自己的程序中找到关于setter/getter的底层源码却没有找到,就只在网上找到 了一篇这样的帖子http://pouyang.iteye.com/blog/634844
1.长度大于1,并且前两个字符大写时,返回原字符串
2.其他情况下,把原字符串的首个字符小写处理后返回
.做个小测试
银联报文解析_第6张图片

验证通过.那么得出解决方案

问题解决办法

public static   T convObject(String str, Class cls) {
		if(JudgeUtils.isBlank(str)){
			return null;
		}
		String res=str.substring(1,str.length()-1);
        Map m = new HashMap();
        String[] strs = res.split("&");
        for(String s:strs){
        	String[] ms = s.split("=");
        	m.put(ms[0], ms[1]);
        }
        T obj = null;
		try {
			obj =cls.newInstance();
	        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
	        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
	        for (PropertyDescriptor property : propertyDescriptors) {
	            Method setter = property.getWriteMethod();
	            if (setter != null) {
					for (String key : m.keySet()) {
					  if(key.equalsIgnoreCase(property.getName())){
			                setter.invoke(obj, m.get(key));
					  }
					}
	            }
	        }
		} catch (InstantiationException e) {
			logger.error(e.getMessage(), e);
		} catch (IllegalAccessException e) {
			logger.error(e.getMessage(), e);
		}catch (IllegalArgumentException e) {
			logger.error(e.getMessage(), e);
		} catch (InvocationTargetException e) {
			logger.error(e.getMessage(), e);
		}catch (IntrospectionException e) {
			logger.error(e.getMessage(), e);
		}
        System.out.println(obj);
		return obj;
	}

你可能感兴趣的:(java)