javabean 與固定格式報文相互解包拆包類
阿新 • • 發佈:2019-02-20
最近在用java做報文的解包、拆包,其中包括xml報文和javabean之間的轉換,採用了開源框架castor。
javabean和固定格式報文的轉換,沒有找到相應的開源框架,自己寫了一個通用的類,拋磚引玉一下,請大家參考,歡迎提意見一起探討完善。
其中,類名、方法名,為了容易看懂,沒有進行縮寫。
固定報文的格式定義,採用了string的三維陣列,進一步開發,可以放置到xml配置檔案中。目前各種框架都採用xml作為配置檔案。
欄位長度不夠時,補充字元是char到byte進行了強制轉換,不適用於所有字元。
其中,Method類生成,每個欄位都生成一個,不能重複使用,通用的反射框架,一般是先對類進行解析,生成靜態變數容器Map,進行儲存,再根據配置檔案,直接去靜態變數容器Map中進行獲取,可以重複使用,這裡是可以進一步完善的地方。
一個類只能簡單的做到對報文生成解析工作與報文的具體格式的解耦,不再需要為每一個報文的生成和解析分別寫一個方法,報文變了可以只修改報文定義的String陣列就可以。
Java程式碼
javabean和固定格式報文的轉換,沒有找到相應的開源框架,自己寫了一個通用的類,拋磚引玉一下,請大家參考,歡迎提意見一起探討完善。
其中,類名、方法名,為了容易看懂,沒有進行縮寫。
固定報文的格式定義,採用了string的三維陣列,進一步開發,可以放置到xml配置檔案中。目前各種框架都採用xml作為配置檔案。
欄位長度不夠時,補充字元是char到byte進行了強制轉換,不適用於所有字元。
其中,Method類生成,每個欄位都生成一個,不能重複使用,通用的反射框架,一般是先對類進行解析,生成靜態變數容器Map,進行儲存,再根據配置檔案,直接去靜態變數容器Map中進行獲取,可以重複使用,這裡是可以進一步完善的地方。
一個類只能簡單的做到對報文生成解析工作與報文的具體格式的解耦,不再需要為每一個報文的生成和解析分別寫一個方法,報文變了可以只修改報文定義的String陣列就可以。
Java程式碼
- import java.io.UnsupportedEncodingException;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.List;
- publicclass JavaBeanConvertFixedLengthPacket {
- /**
- * 將pojo按照requestPacketFormatArray三維陣列定義的格式生成固定格式報文
- * @param requestPacketFormatArray
- * @param pojo
- * @param rightCharStr
- * @param leftCharStr
- * @param charsetName
- * @return
- * @throws Exception
- */
- publicstatic String javaBeanToFixedLengthPacket(String[][][] requestPacketFormatArray,Object pojo,char rightCharStr,char leftCharStr,String charsetName)
- 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){
- thrownew Exception("invalid field defined");
- }
- for(int j=0;j<requestFieldFormatArrayLength;j++){
- String[] requestPropertyFormatArray = requestFieldFormatArray[j];
- int requestPropertyFormatArrayLength = requestPropertyFormatArray.length;
- if(requestPropertyFormatArrayLength!=2){
- thrownew 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
- */
- publicstaticvoid 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){
- thrownew Exception("invalid field defined");
- }
- for(int j=0;j<requestFieldFormatArrayLength;j++){
- String[] requestPropertyFormatArray = requestFieldFormatArray[j];
- int requestPropertyFormatArrayLength = requestPropertyFormatArray.length;
- if(requestPropertyFormatArrayLength!=2){
- thrownew 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 = newbyte[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());
- }
- elseif(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)));
- }
- elseif(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)));
- }
- elseif(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
- */
- publicstatic String formatFieldByRightChar(String str,int size,char charStr,String charsetName) throws UnsupportedEncodingException
- {
- byte[] bufferByte = newbyte[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);
- returnnew String(bufferByte);
- }
- publicstatic 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
- */
- publicstatic String formatFieldByLeftChar(String str,int size,char charStr,String charsetName) throws UnsupportedEncodingException
- {
- byte[] bufferByte = newbyte[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);
- returnnew String(bufferByte);
- }
- /**
- * @param str
- * @param size
- * @param charsetName
- * @return
- * @throws UnsupportedEncodingException
- */
- publicstatic String formatFieldByLeftChar(String str,int size,String charsetName) throws UnsupportedEncodingException
- {
- return formatFieldByLeftChar(str,size,'0',charsetName);
- }
- publicstaticvoid main(String args[]){
- class TestInvode{
- String cardno;
- String name;
- int num;
- float amount;
- public String getCardno() {
- return cardno;
- }
- publicvoid setCardno(String cardno) {
- this.cardno = cardno;
- }
- public String getName() {
- return name;
- }
- publicvoid setName(String name) {
- this.name = name;
- }
- publicint getNum() {
- return num;
- }
- publicvoid setNum(int num) {
- this.num = num;
- }
- publicfloat getAmount() {
- return amount;
- }
- publicvoid 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());
- }
- }