
com.minlia.iot.marshal.deserialize.XmlApiDeserializer Maven / Gradle / Ivy
package com.minlia.iot.marshal.deserialize;
import com.minlia.iot.annotation.XmlElementArray;
import com.minlia.iot.body.ApiHttpResponseBody;
import com.minlia.iot.body.response.StatefulApiResponseBody;
import com.minlia.iot.context.ApiRuntimeContext;
import com.minlia.iot.marshal.ApiMarshalWrappedBody;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;
import javax.xml.bind.annotation.XmlElement;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
/**
* Created by will on 9/12/17.
* 默认抽象JSON反序列化器
*/
@Slf4j
public class XmlApiDeserializer extends
AbstractAnnotationApiDeserializer {
public StatefulApiResponseBody execute(ApiMarshalWrappedBody body,
ApiRuntimeContext context) {
try {
Document document = DocumentHelper.parseText(body.getRaw());
super.printXML(document);
Element rootElement = document.getRootElement();
Class statefulApiResponseBodyClass = (Class) body
.getStatefulResponseBodyClass();
StatefulApiResponseBody statefulApiResponseBody=(StatefulApiResponseBody)statefulApiResponseBodyClass.newInstance();
// statefulApiResponseBody= makeResponseXmlBody(rootElement,statefulApiResponseBodyClass);
for (Field field : statefulApiResponseBodyClass.getDeclaredFields()) {
field.setAccessible(true);
if (field.isAnnotationPresent(XmlElement.class)) {
dealXmlElementAnnotation(rootElement, field, statefulApiResponseBody);
}
}
// for (Field field : statefulApiResponseBodyClass.getDeclaredFields()) {
// field.setAccessible(true);
// if (field.isAnnotationPresent(XmlElement.class)) {
// dealXmlElementAnnotation(rootElement, field, statefulApiResponseBody);
// } else if (field.isAnnotationPresent(XmlElementArray.class)) {
// dealXmlElementArrayAnnotation(rootElement, field, statefulApiResponseBody);
// }
// }
Class apiHttpResponseBodyClass =(Class)body.getBusinessResponseBodyClass();
ApiHttpResponseBody apiHttpResponseBody= makeResponseXmlBody(rootElement,apiHttpResponseBodyClass);
statefulApiResponseBody.setPayload((RESPONSE)apiHttpResponseBody);
return statefulApiResponseBody;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
protected E makeResponseXmlBody(Element rootElement,
Class clazz)
throws IllegalAccessException, InstantiationException {
E entity = clazz.newInstance();
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
if (field.isAnnotationPresent(XmlElement.class)) {
dealXmlElementAnnotation(rootElement, field, entity);
} else if (field.isAnnotationPresent(XmlElementArray.class)) {
dealXmlElementArrayAnnotation(rootElement, field, entity);
}
}
return entity;
}
/**
* 处理@{@link XmlElement}注解
*/
@SuppressWarnings("unchecked")
protected void dealXmlElementAnnotation(Element rootElement, Field field, Object entity) {
XmlElement xmlElementAnnotation = field.getAnnotation(XmlElement.class);
Element element = rootElement.element(xmlElementAnnotation.name());
if (Objects.nonNull(element)) {
Optional
© 2015 - 2025 Weber Informatics LLC | Privacy Policy