• JAXB--obj2xml&xml2obj


    参考:

    https://www.cnblogs.com/mumuxinfei/p/8948299.html  去掉 xsi:type="echoBody" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    测试

        public void test6() throws Exception  {
            LogisticsOrderListModel model =new LogisticsOrderListModel();
            model.setAccessCode("111111111");
            JAXBContext jaxbContext =JAXBContext.newInstance(model.getClass());
            Marshaller marshaller = jaxbContext.createMarshaller();
            //marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            StringWriter stringWriter=new StringWriter();
            marshaller.marshal(model, stringWriter);
            String result=stringWriter.toString();
            System.out.println(result);
            com.sf.wms.sao.dto.Request request=new com.sf.wms.sao.dto.Request();
            request.setBody(new com.sf.wms.sao.dto.Request.Body(model));
            System.out.println(JAXBUtil.writeToString(request,request.getClass(),model.getClass()));
        }
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name = "Request")
    @Data
    public class Request {
    
        private String service;
    
        private String lang;
    
        private String head;
    
        @XmlElement(name="body")
        private Body body;
    
    
        @XmlAccessorType(XmlAccessType.FIELD)
        @Data
        @AllArgsConstructor
        public static class Body {
            @XmlAnyElement(lax = true)
            private Object order;
        }
    }
    @Request("OrderService")
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name = "order")
    @Data
    public class LogisticsOrderListModel {
        /**
         * 订单个数
         */
        private Integer orderCount;
    
        /**
         * 支持一个或多个订单
         */
        private List<LogisticsOrderModel> orderList;
    
        /**
         * 顾客编码
         */
        @XmlElement
        private String accessCode;

    注意

    1:<?xml version="1.0" encoding="UTF-8"?> 的生成

    2.去掉 xsi:type="echoBody" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    工具类 

    1. spring中提供的convert   Jaxb2RootElementHttpMessageConverter

    2.自定义的工具类 

    注意:由于使用了缓存,缓存的key为第一个class,一般应该把泛型的类或Object类放在第一位

    JAXBUtil.writeToString(model.getClass(),request,request.getClass())
    public class JAXBUtil {
    
        private static XMLOutputFactory xmlOutputFactory=XMLOutputFactory.newFactory();;
    
    
    
        public static String writeToString(Object o,Class...clazz) throws Exception {
            try {
                Marshaller marshaller = createMarshaller(clazz);
                marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
                marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(baos, (String) marshaller.getProperty(Marshaller.JAXB_ENCODING));
                xmlStreamWriter.writeStartDocument((String) marshaller.getProperty(Marshaller.JAXB_ENCODING), "1.0");
                marshaller.marshal(o, xmlStreamWriter);
                xmlStreamWriter.writeEndDocument();
                xmlStreamWriter.close();
                return new String(baos.toByteArray());
    
            }
            catch (MarshalException ex) {
                throw ex;
            }
            catch (JAXBException ex) {
                throw new HttpMessageConversionException("Invalid JAXB setup: " + ex.getMessage(), ex);
            }
        }
    
        public static String writeToString(Object o) throws Exception {
            try {
                Class<?> clazz = ClassUtils.getUserClass(o);
                Marshaller marshaller = createMarshaller(clazz);
                marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
                marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
    
                //设置输出流
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(baos);
                xmlStreamWriter.writeStartDocument((String) marshaller.getProperty(Marshaller.JAXB_ENCODING), "1.0");
                marshaller.marshal(o, xmlStreamWriter);
                xmlStreamWriter.writeEndDocument();
                xmlStreamWriter.close();
                return new String(baos.toByteArray());
            }
            catch (MarshalException ex) {
                throw ex;
            }
            catch (JAXBException ex) {
                throw new HttpMessageConversionException("Invalid JAXB setup: " + ex.getMessage(), ex);
            }
        }
    
    
    
    
    
        private static final ConcurrentMap<Class<?>, JAXBContext> jaxbContexts = new ConcurrentHashMap<>(64);
    
        /**
         * Create a new {@link Marshaller} for the given class.
         * @param clazz the class to create the marshaller for
         * @return the {@code Marshaller}
         * @throws HttpMessageConversionException in case of JAXB errors
         */
        protected  static Marshaller createMarshaller(Class<?>... clazz) {
            try {
                JAXBContext jaxbContext = getJaxbContext(clazz);
                Marshaller marshaller = jaxbContext.createMarshaller();
                customizeMarshaller(marshaller);
                return marshaller;
            }
            catch (JAXBException ex) {
                throw new HttpMessageConversionException(
                        "Could not create Marshaller for class [" + clazz + "]: " + ex.getMessage(), ex);
            }
        }
    
        protected static void customizeMarshaller(Marshaller marshaller) {
        }
    
        protected static Unmarshaller createUnmarshaller(Class<?> clazz) {
            try {
                JAXBContext jaxbContext = getJaxbContext(clazz);
                Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
                customizeUnmarshaller(unmarshaller);
                return unmarshaller;
            }
            catch (JAXBException ex) {
                throw new HttpMessageConversionException(
                        "Could not create Unmarshaller for class [" + clazz + "]: " + ex.getMessage(), ex);
            }
        }
    
        protected static void customizeUnmarshaller(Unmarshaller unmarshaller) {
        }
    
        protected static JAXBContext getJaxbContext(Class<?>... clazz) {
            Assert.notNull(clazz, "Class must not be null");
            JAXBContext jaxbContext = jaxbContexts.get(clazz);
            if (jaxbContext == null) {
                try {
                    jaxbContext = JAXBContext.newInstance(clazz);
                    jaxbContexts.putIfAbsent(clazz[0], jaxbContext);
                }
                catch (JAXBException ex) {
                    throw new HttpMessageConversionException(
                            "Could not instantiate JAXBContext for class [" + clazz + "]: " + ex.getMessage(), ex);
                }
            }
            return jaxbContext;
        }
    }
  • 相关阅读:
    THUWC2020 游记
    USACO14MAR The Lazy Cow(Gold)
    luogu P3768 简单的数学题
    2017/9/22模拟赛
    2017/9/20模拟赛
    2017/9/15模拟赛
    刷屏代码·稳 from林凯
    2017/9/13模拟赛
    【9018:1368】八数码
    2017/9/10模拟赛
  • 原文地址:https://www.cnblogs.com/z-test/p/11678129.html
Copyright © 2020-2023  润新知