Axis标准验证+xml参数解析

本文介绍了一种使用Java反射机制解析XML数据的方法,并将其映射到指定的Java类中。该方法适用于处理符合特定接口规范的XML数据,能自动将XML元素转换为Java对象属性。

直接上代码


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, "开发者账户验证未通过!");
		}
	}
	
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值