Axis標準驗證+xml引數解析
阿新 • • 發佈:2018-12-27
直接上程式碼
public InDataPacket(String xml, Class<?> clazz) 是重點,反射解析xml到類中
import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.namespace.QName; import javax.xml.soap.SOAPException; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.message.MessageElement; import org.apache.axis.message.SOAPHeader; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.springframework.beans.BeanUtils; public class InDataPacket { private String userName;//介面呼叫者賬戶 private String password;//介面呼叫者賬戶密碼 private String inputData;//傳入資料 private Object obj;//解析後物件 private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getInputData() { return inputData; } public void setInputData(String inputData) { this.inputData = inputData; } public Object getObj() { return obj; } public void setObj(Object obj) { this.obj = obj; } /** * 無參建構函式 */ public InDataPacket() { } /** * 帶參建構函式 * @param xml */ public InDataPacket(String xml){ Document doc; String str=xml; //獲取訊息頭內容 MessageContext msgContext = MessageContext.getCurrentContext(); Message message=msgContext.getCurrentMessage(); SOAPHeader header; try { header = (SOAPHeader) message.getSOAPHeader(); MessageElement headEle=header.getChildElement(new QName("http://schemas.xmlsoap.org/soap/envelope/", "Head","soap")); //使用者名稱 MessageElement userNameEle=headEle.getChildElement(new QName("http://schemas.xmlsoap.org/soap/envelope/", "username","soap")); String userNameText=userNameEle.getValue(); //密碼 MessageElement passwordEle=headEle.getChildElement(new QName("http://schemas.xmlsoap.org/soap/envelope/", "password","soap")); String passwordText=passwordEle.getValue(); //驗證使用者名稱密碼(待補充) this.setUserName(userNameText); this.setPassword(passwordText); this.verifyDeveloper(userNameText, passwordText); } catch (SOAPException e1) { e1.printStackTrace(); throw new BusinessException(CodeMessageDefine.EXCEPTION_CODE,"資料不符合介面規範!"); } //解析xml try { doc = DocumentHelper.parseText(str); Element root=doc.getRootElement(); String rootName=root.getName(); if (!"input".equals(rootName)) { throw new BusinessException(CodeMessageDefine.EXCEPTION_CODE,"資料不符合介面規範!"); } this.setInputData(str); } catch (DocumentException e) { throw new BusinessException(CodeMessageDefine.EXCEPTION_CODE,"xml格式有誤!"); } } /** * 帶參建構函式 * @param xml * @param clazz */ public InDataPacket(String xml, Class<?> clazz){ Document doc; String str=xml; //獲取訊息頭內容 MessageContext msgContext = MessageContext.getCurrentContext(); Message message=msgContext.getCurrentMessage(); SOAPHeader header; try { header = (SOAPHeader) message.getSOAPHeader(); MessageElement headEle=header.getChildElement(new QName("http://schemas.xmlsoap.org/soap/envelope/", "Head","soap")); //使用者名稱 MessageElement userNameEle=headEle.getChildElement(new QName("http://schemas.xmlsoap.org/soap/envelope/", "username","soap")); String userNameText=userNameEle.getValue(); //密碼 MessageElement passwordEle=headEle.getChildElement(new QName("http://schemas.xmlsoap.org/soap/envelope/", "password","soap")); String passwordText=passwordEle.getValue(); //驗證使用者名稱密碼(待補充) this.setUserName(userNameText); this.setPassword(passwordText); this.verifyDeveloper(userNameText, passwordText); } catch (SOAPException e1) { e1.printStackTrace(); throw new BusinessException(CodeMessageDefine.EXCEPTION_CODE,"資料不符合介面規範!"); } //解析xml try { doc = DocumentHelper.parseText(str); Element root=doc.getRootElement(); String rootName=root.getName(); if (!"input".equals(rootName)) { throw new BusinessException(CodeMessageDefine.EXCEPTION_CODE,"資料不符合介面規範!"); } /** 如果傳入class則反射自動裝配XML值 **/ if(clazz != null){ obj = initObj(clazz, root); } /** 設定XML引數到變數 **/ this.setInputData(str); } catch (DocumentException e) { throw new BusinessException(CodeMessageDefine.EXCEPTION_CODE,"xml格式有誤!"); } } /** * 遞迴初始化Obj實體 * @方法名: initObj * @描述: * @引數 @param clazz * @引數 @param root * @引數 @return * @返回型別 boolean */ private Object initObj(Class<?> clazz, Element root){ if(clazz == null){ return false; } Object target; try { target = clazz.newInstance(); for (Iterator<?> ite = root.elements().iterator(); ite.hasNext();) { Element ele = (Element) ite.next(); List<?> elements = ele.elements(); String key = ele.getName(); Object value = ele.getText(); PropertyDescriptor propertyDescriptor = BeanUtils .getPropertyDescriptor(clazz, key); if(propertyDescriptor == null){ continue; } Method setter = propertyDescriptor.getWriteMethod(); if(setter == null){ continue; } Class<?> propertyType = propertyDescriptor.getPropertyType(); if(elements.size() == 0){//無子節點 try{ //Long if(propertyType.getName().equals("java.lang.Long")){ value = Long.parseLong(ele.getText()); }else if(propertyType.getName().equals("java.lang.Double")){ value = Double.parseDouble(ele.getText()); }else if(propertyType.getName().endsWith("java.util.Date")){ value = sdf.parse(ele.getText()); } }catch(NumberFormatException e){ throw new BusinessException(CodeMessageDefine.EXCEPTION_CODE,"資料不符合介面規範!["+key+"]"); } catch (ParseException e) { throw new BusinessException(CodeMessageDefine.EXCEPTION_CODE,"資料不符合介面規範!["+key+"]"); } }else{//有子節點 //List型別 if(propertyType.isAssignableFrom(List.class)){ if(setter.getGenericParameterTypes()[0] instanceof ParameterizedType){ ParameterizedType paramType = (ParameterizedType)setter.getGenericParameterTypes()[0]; if(paramType == null){ continue; } Class paramsClass = (Class) paramType.getActualTypeArguments()[0]; if(paramsClass == null){ continue; } List<Object> childList = new ArrayList<Object>(); Object obj2 = null; for(int i=0; i<elements.size(); ++i){ obj2 = initObj(paramsClass, (Element)elements.get(i)); if(obj2 == null){ continue; } childList.add(obj2); } if(childList.size() == 0){ continue; } value = childList; }else{ continue; } } } if (!Modifier.isPublic(setter.getDeclaringClass() .getModifiers())) { setter.setAccessible(true); } setter.invoke(target, new Object[] { value }); } //obj = target; } catch (InstantiationException e) { e.printStackTrace(); throw new BusinessException(CodeMessageDefine.EXCEPTION_CODE,"xml解析有誤!"); } catch (IllegalAccessException e) { e.printStackTrace(); throw new BusinessException(CodeMessageDefine.EXCEPTION_CODE,"xml解析有誤!"); } catch (IllegalArgumentException e) { e.printStackTrace(); throw new BusinessException(CodeMessageDefine.EXCEPTION_CODE,"xml解析有誤!"); } catch (InvocationTargetException e) { e.printStackTrace(); throw new BusinessException(CodeMessageDefine.EXCEPTION_CODE,"xml解析有誤!"); } return target; } /** * 開發者使用者驗證 * @param name * @param password * @return */ private String verifyDeveloper(String name,String password){ if (name==null||name.length()==0) { throw new BusinessException(CodeMessageDefine.FAIL_CODE, "開發者<username>不能為空!"); } if (password==null||password.length()==0) { throw new BusinessException(CodeMessageDefine.FAIL_CODE, "開發者<password>不能為空!"); } if (name.equals(CodeMessageDefine.DEVELOPERNAME)&&password.equals(CodeMessageDefine.DEVELOPERPASSWORD)) { return "1"; }else{ throw new BusinessException(CodeMessageDefine.FAIL_CODE, "開發者賬戶驗證未通過!"); } } }