- 浏览: 1473 次
- 性别:
- 来自: 上海
文章分类
最新评论
抛砖引玉,写了一个javabean和固定格式报文相互解包、拆包的类,供大家参考
最近在用java做报文的解包、拆包,其中包括xml报文和javabean之间的转换,采用了开源框架castor。
javabean和固定格式报文的转换,没有找到相应的开源框架,自己写了一个通用的类,抛砖引玉一下,请大家参考,欢迎提意见一起探讨完善。
其中,类名、方法名,为了容易看懂,没有进行缩写。
固定报文的格式定义,采用了string的三维数组,进一步开发,可以放置到xml配置文件中。目前各种框架都采用xml作为配置文件。
字段长度不够时,补充字符是char到byte进行了强制转换,不适用于所有字符。
其中,Method类生成,每个字段都生成一个,不能重复使用,通用的反射框架,一般是先对类进行解析,生成静态变量容器Map,进行存储,再根据配置文件,直接去静态变量容器Map中进行获取,可以重复使用,这里是可以进一步完善的地方。
一个类只能简单的做到对报文生成解析工作与报文的具体格式的解耦,不再需要为每一个报文的生成和解析分别写一个方法,报文变了可以只修改报文定义的String数组就可以。
javabean和固定格式报文的转换,没有找到相应的开源框架,自己写了一个通用的类,抛砖引玉一下,请大家参考,欢迎提意见一起探讨完善。
其中,类名、方法名,为了容易看懂,没有进行缩写。
固定报文的格式定义,采用了string的三维数组,进一步开发,可以放置到xml配置文件中。目前各种框架都采用xml作为配置文件。
字段长度不够时,补充字符是char到byte进行了强制转换,不适用于所有字符。
其中,Method类生成,每个字段都生成一个,不能重复使用,通用的反射框架,一般是先对类进行解析,生成静态变量容器Map,进行存储,再根据配置文件,直接去静态变量容器Map中进行获取,可以重复使用,这里是可以进一步完善的地方。
一个类只能简单的做到对报文生成解析工作与报文的具体格式的解耦,不再需要为每一个报文的生成和解析分别写一个方法,报文变了可以只修改报文定义的String数组就可以。
import java.io.UnsupportedEncodingException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; public class JavaBeanConvertFixedLengthPacket { /** * 将pojo按照requestPacketFormatArray三维数组定义的格式生成固定格式报文 * @param requestPacketFormatArray * @param pojo * @param rightCharStr * @param leftCharStr * @param charsetName * @return * @throws Exception */ public static String javaBeanToFixedLengthPacket(String[][][] requestPacketFormatArray,Object pojo,char rightCharStr,char leftCharStr,String charsetName) throws Exception{ String fieldName = new String(); String fieldLenght = new String(); String parameterClass = new String(); StringBuffer requestStr = new StringBuffer(); int requestPacketFormatArrayLength = requestPacketFormatArray.length; for(int i=0;i<requestPacketFormatArrayLength;i++){ String[][] requestFieldFormatArray = requestPacketFormatArray[i]; int requestFieldFormatArrayLength = requestFieldFormatArray.length; if(requestFieldFormatArrayLength!=3){ throw new Exception("invalid field defined"); } for(int j=0;j<requestFieldFormatArrayLength;j++){ String[] requestPropertyFormatArray = requestFieldFormatArray[j]; int requestPropertyFormatArrayLength = requestPropertyFormatArray.length; if(requestPropertyFormatArrayLength!=2){ throw new Exception("invalid field property defined"); } if(requestPropertyFormatArray[0].equals("name")) fieldName = requestPropertyFormatArray[1]; if(requestPropertyFormatArray[0].equals("length")) fieldLenght = requestPropertyFormatArray[1]; if(requestPropertyFormatArray[0].equals("parameterClass")) parameterClass = requestPropertyFormatArray[1]; } Class c = pojo.getClass(); Method m = c.getMethod("get" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1)); String fieldValue = m.invoke(pojo)==null?"":m.invoke(pojo).toString(); if(parameterClass.equals("java.lang.String")) requestStr.append(formatFieldByRightChar(fieldValue,Integer.parseInt(fieldLenght),rightCharStr,charsetName)); else{ requestStr.append(formatFieldByLeftChar(fieldValue,Integer.parseInt(fieldLenght),leftCharStr,charsetName)); } } return requestStr.toString(); } /** * 将strByte字符串按照requestPacketFormatArray三维数组定义的格式生pojo * @param requestPacketFormatArray * @param pojo * @param strByte * @param charsetName * @throws Exception */ public static void fixedLengthPacketToJavaBean(String[][][] requestPacketFormatArray,Object pojo,String str,String charsetName) throws Exception{ String fieldName = new String(); String fieldLenght = new String(); String parameterClass = new String(); StringBuffer requestStr = new StringBuffer(); byte[] strByte = str.getBytes(charsetName); int index = 0; int length = strByte.length; int requestPacketFormatArrayLength = requestPacketFormatArray.length; for(int i=0;i<requestPacketFormatArrayLength;i++){ String[][] requestFieldFormatArray = requestPacketFormatArray[i]; int requestFieldFormatArrayLength = requestFieldFormatArray.length; if(requestFieldFormatArrayLength!=3){ throw new Exception("invalid field defined"); } for(int j=0;j<requestFieldFormatArrayLength;j++){ String[] requestPropertyFormatArray = requestFieldFormatArray[j]; int requestPropertyFormatArrayLength = requestPropertyFormatArray.length; if(requestPropertyFormatArrayLength!=2){ throw new Exception("invalid field property defined"); } if(requestPropertyFormatArray[0].equals("name")) fieldName = requestPropertyFormatArray[1]; if(requestPropertyFormatArray[0].equals("length")) fieldLenght = requestPropertyFormatArray[1]; if(requestPropertyFormatArray[0].equals("parameterClass")) parameterClass = requestPropertyFormatArray[1]; } Class c = pojo.getClass(); int tempLenght = Integer.parseInt(fieldLenght); byte[] byteTemp = new byte[tempLenght]; for(int k=0;k<tempLenght;k++) byteTemp[k] = strByte[index+k]; index = index+tempLenght; if(parameterClass.equals("java.lang.String")){ Method m = c.getMethod("set" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1),Class.forName(parameterClass)); m.invoke(pojo,new String(byteTemp).trim()); } else if(parameterClass.equals("int")){ Method m = c.getMethod("set" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1),int.class);; //Method mArray[] = c.getDeclaredMethods(); //for(Method mTemp:mArray) // if(mTemp.getName().equals("set" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1))) // m=mTemp; m.invoke(pojo,Integer.valueOf(new String(byteTemp))); } else if(parameterClass.equals("long")){ Method m = null; Method mArray[] = c.getDeclaredMethods(); for(Method mTemp:mArray) if(mTemp.getName().equals("set" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1))) m=mTemp; m.invoke(pojo,Long.valueOf(new String(byteTemp))); } else if(parameterClass.equals("float")){ Method m = null; Method mArray[] = c.getDeclaredMethods(); for(Method mTemp:mArray) if(mTemp.getName().equals("set" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1))) m=mTemp; m.invoke(pojo,Float.valueOf(new String(byteTemp))); } } } /** * str右补charStr参数指定的字符,格式化为指定byte长度为size的字符串 * @param str 原字符串大小 * @param size byte长度 * @param charStr 补充字符 * *@param charsetName * the name of a supported * {@link java.nio.charset.Charset </code>charset<code>} * @return * @throws UnsupportedEncodingException */ public static String formatFieldByRightChar(String str,int size,char charStr,String charsetName) throws UnsupportedEncodingException { byte[] bufferByte = new byte[size]; for (int i = 0; i < bufferByte.length; i++) { bufferByte[i] = (byte) charStr; } byte[] strByte = str.getBytes(charsetName); // 得到字符的字节数 int strLength = strByte.length; System.arraycopy(strByte, 0, bufferByte, 0, size>strLength?strLength:size); return new String(bufferByte); } public static String formatFieldByRightChar(String str,int size,String charsetName) throws UnsupportedEncodingException { return formatFieldByRightChar(charsetName, size, ' ', charsetName); } /** * str左补charStr参数指定的字符,格式化为指定byte长度为size的字符串 * @param str 原字符串大小 * @param size byte长度 * @param charStr 补充字符 * @param charsetName * the name of a supported * {@link java.nio.charset.Charset </code>charset<code>} * @return * @throws UnsupportedEncodingException */ public static String formatFieldByLeftChar(String str,int size,char charStr,String charsetName) throws UnsupportedEncodingException { byte[] bufferByte = new byte[size]; for (int i = 0; i < bufferByte.length; i++) { bufferByte[i] = (byte) charStr; } byte[] strByte = str.getBytes(charsetName); int strLength = strByte.length; System.arraycopy(strByte, 0, bufferByte, (size-strLength)>0?(size-strLength):0, (size-strLength)>0?strLength:size); return new String(bufferByte); } /** * @param str * @param size * @param charsetName * @return * @throws UnsupportedEncodingException */ public static String formatFieldByLeftChar(String str,int size,String charsetName) throws UnsupportedEncodingException { return formatFieldByLeftChar(str,size,'0',charsetName); } public static void main(String args[]){ class TestInvode{ String cardno; String name; int num; float amount; public String getCardno() { return cardno; } public void setCardno(String cardno) { this.cardno = cardno; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public float getAmount() { return amount; } public void setAmount(float amount) { this.amount = amount; } } String requestFormat[][][] = { { {"name","cardno"},{"length","16"},{"parameterClass","java.lang.String"} }, { {"name","name"},{"length","10"},{"parameterClass","java.lang.String"} } , { {"name","num"},{"length","10"},{"parameterClass","int"} }, { {"name","amount"},{"length","10"},{"parameterClass","float"} } }; TestInvode ti = new TestInvode(); ti.cardno = "4512"; ti.name="不告诉你"; ti.num = 95; ti.amount=45454.44f; try { System.out.println("######"+javaBeanToFixedLengthPacket(requestFormat, ti, ' ', '0', "gb2312")); } catch (Exception e) { e.printStackTrace(); } String str = "4512 不告诉你 00000000950045454.44"; TestInvode tii = new TestInvode(); try { fixedLengthPacketToJavaBean(requestFormat, tii, str,"gb2312"); } catch (Exception e) { e.printStackTrace(); } System.out.println("######tii.cardno:"+tii.cardno); System.out.println("######tii.name:"+tii.name); System.out.println("######tii.num:"+tii.num); String s = "人"; try { System.out.println(s.getBytes("utf-8").length); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getContextClassLoader()); System.out.println(tii.getClass().getClassLoader()); System.out.println(ClassLoader.getSystemClassLoader()); } }
相关推荐
// 假设我们有一个JavaBean对象 MyJavaBean myBean = new MyJavaBean(); // ... 初始化myBean的属性 ObjectMapper mapper = new ObjectMapper(); String jsonString = mapper.writeValueAsString(myBean); ``...
下面我们将详细探讨如何实现JavaBean到XML以及XML到JavaBean的转换,并介绍一个用于此目的的工具类和相关的jar包。 首先,JavaBean是一种符合特定规范的Java类,它通常具有公共的getter和setter方法,用于封装属性...
标题 "自己写的一个购物车(jsp+javabean)" 提供了一个关于小型电子商务系统实现的基础信息,这是一个基于JavaWeb技术的简单购物车应用。在这个项目中,开发者使用了JSP(JavaServer Pages)和JavaBean两种核心组件来...
这个简单的用户验证示例是学习JSP和JavaBean协同工作的一个良好起点,它展示了如何在实际项目中组织和管理数据,以及如何使用JavaBean来进行业务逻辑处理。对于初学者来说,这是一个理解和实践Web开发基础的好机会。
为写成 JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他 Java 类可以通过自身机制发现和...
这个标题揭示了一个基于Web的博客应用程序,它采用经典的Java Web开发技术栈:JSP(JavaServer Pages)、JavaBean和DAO(Data Access Object)模式。这是一个典型的MVC(Model-View-Controller)架构的简化版本,...
总结来说,JavaBean是Java编程中一个重要的概念,它简化了数据封装和业务处理,提高了代码的复用性和可维护性。在MyEclipse等IDE的支持下,开发者可以更轻松地创建和使用JavaBean,以构建健壮且易于维护的Java应用...
JavaBean是Java编程中的一个概念,它是一种符合特定规范的Java类,通常用来封装业务逻辑和数据,便于对象的创建和使用。"Json一键转Javabean工具"是一个实用的开发辅助工具,它能够帮助Java开发者快速地将JSON格式的...
在本项目中,我们主要探讨如何使用JSP(JavaServer Pages)、JavaBean和Servlet技术来构建一个简单的在线留言板系统。这个系统将允许用户提交留言,并将这些数据持久化存储,以便其他用户可以查看和交互。以下是对每...
以及一个JavaBean类,如`UserBean.java`,它封装了用户信息并提供了验证方法。为了进一步学习这个例子,我们需要解压文件并查看具体的代码实现。 总的来说,Servlet和JavaBean是Java Web开发中的基本元素,理解它们...
JavaBean遵循一定的规范,通常包含一个无参数的构造器,属性私有化并提供getter和setter方法,以及可能的逻辑业务方法。例如,一个简单的User JavaBean可以这样定义: ```java public class User { private String...
JavaBean是一种特殊的Java类,它是Java编程语言中的一个核心概念,尤其在开发企业级应用程序时极为常见。JavaBean遵循特定的规范,使它们能够被其他Java应用或开发工具(如IDEs)识别、可视化和操作。JavaBean的主要...
1. **公共类**:JavaBean必须是一个公共类。 2. **无参数构造器**:它应该有一个公共的无参构造器,方便实例化。 3. **属性封装**:JavaBean通常包含私有属性,用getters和setters方法进行访问控制,提供数据封装。 ...
在本资源"javabean工具类.rar"中,提供了一个工具,该工具能够根据数据库表自动生成对应的JavaBean类,这大大简化了开发过程,减少了手动编写代码的工作量。支持的数据库包括MYSQL、ORACLE和SQLSERVER,涵盖了广泛的...
`collectionUtils`可能是提供这些转换功能的一个工具类,包含了一系列关于集合操作的实用方法,包括`Map`和`JavaBean`的转换。在实际项目中,这样的工具类能帮助开发者提高代码的可读性和可维护性,避免重复编写转换...
在本案例中,我们可以创建一个名为`CircleBean`的JavaBean,它包含圆的半径属性(如`radius`)和对应的getter与setter方法。此外,还可以提供计算圆面积和周长的方法,如`getArea()`和`getCircumference()`。这样,...
首先,我们需要创建一个JavaBean类,用于封装数据库连接的相关属性和方法。通常,此类会包含数据库URL、用户名、密码、驱动类名等属性,并提供建立连接、执行SQL语句、关闭连接等方法。例如,我们可以创建一个名为`...
总的来说,这个项目展示了如何使用JSP、Servlet和JavaBean来构建一个功能完备的商品分类管理系统,涵盖了数据的创建、读取、更新和删除(CRUD)操作,体现了MVC模式在Web开发中的应用。通过这种方式,开发者可以实现...
JavaBean技术是Java Web开发中的一个重要组成部分,它主要用于封装数据和业务逻辑,使得代码更加模块化,便于重用和管理。在"WEB应用技术 JavaBean技术应用"的实验中,我们学习了如何利用JavaBean来处理用户登录的...
首先,我们需要定义一个JavaBean类,其属性与XML元素相对应。然后,使用JAXBContext实例化并生成Unmarshaller对象,通过unmarshal()方法将XML解析成Java对象。同样,可以使用Marshaller对象将JavaBean对象转换回XML...