1. 程式人生 > >Axis標準驗證+xml引數解析

Axis標準驗證+xml引數解析

直接上程式碼

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, "開發者賬戶驗證未通過!");
		}
	}
	
	
}