package com.alibaba.surge.data.api.util; import com.alibaba.surge.data.api.model.xml.MarshallerListener; import org.apache.commons.lang.StringEscapeUtils; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; /** * @author zhenyuan.he */ public class JaxbUtil { public JaxbUtil() { } /** * 有报头 * * @param obj * @return */ public static String toXml(Object obj) { return StringEscapeUtils.unescapeXml(convertBean(obj, "UTF-8", false)); } /** * 没有报头 * * @param obj * @return */ public static String toXmlWithoutFragment(Object obj) { return StringEscapeUtils.unescapeXml(convertBean(obj, "UTF-8", true)); } /** * @param obj 对象 * @param encoding 编码 * @param fragment 是否生成报头 * @return */ private static String convertBean(Object obj, String encoding, boolean fragment) { StringWriter writer = new StringWriter(); String var5; try { JAXBContext context = JAXBContext.newInstance(obj.getClass()); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding); marshaller.setProperty(Marshaller.JAXB_FRAGMENT, fragment); MarshallerListener listener = new MarshallerListener(); marshaller.setListener(listener); marshaller.marshal(obj, writer); var5 = writer.toString(); } catch (JAXBException var14) { throw new RuntimeException(var14); } finally { try { writer.close(); } catch (IOException var13) { var13.printStackTrace(); } } return var5; } public static <T> T convertXml(String xml, Class<T> c) { try { JAXBContext context = JAXBContext.newInstance(c); Unmarshaller unmarshaller = context.createUnmarshaller(); return (T)unmarshaller.unmarshal(new StringReader(xml)); } catch (Throwable e) { throw new RuntimeException(e); } } }
package com.alibaba.surge.data.api.model.xml; import java.lang.reflect.Field; import javax.xml.bind.Marshaller; /** * @author zhenyuan.he */ public class MarshallerListener extends Marshaller.Listener { @Override public void beforeMarshal(Object source) { Field[] fields = source.getClass().getDeclaredFields(); for (Field f : fields) { f.setAccessible(true); try { if (f.getType() != String.class) { continue; } String value = (String)f.get(source); if (value == null || value.length() < 1) { f.set(source, null); continue; } } catch (IllegalAccessException e) { throw new RuntimeException(e); } } } }