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