zoukankan      html  css  js  c++  java
  • 【Bean转XML】JAXB读取xml文档转换为java对象报错:IllegalAnnotationExceptions 类的两个属性具有相同名称 "corpId"

    1、POM 依赖  

    <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>2.3.1</version>
            </dependency>
    
            <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-impl</artifactId>
                <version>2.3.0</version>
            </dependency>
            <dependency>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>jaxb-runtime</artifactId>
                <version>2.3.0</version>
            </dependency>
            <dependency>
                <groupId>javax.activation</groupId>
                <artifactId>activation</artifactId>
                <version>1.1.1</version>
            </dependency>
    

      2、转换工具类

    package com.tencent.iov.qw.utils;
    
    import com.google.common.base.Charsets;
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.Unmarshaller;
    import java.io.StringReader;
    import java.io.StringWriter;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * XML处理工具
     *
     * @author YG
     * @date 2020/01/27
     */
    public class XmlParseUtill {
    
        /**
         * java对象转xml
         *
         * @param obj 对象
         *
         * @return xml
         */
        public static String toXml(Object obj) {
            Map<String, Object> props = new HashMap<>(5);
            // 是否格式化输出xml
            props.put(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            // 输出编码
            props.put(Marshaller.JAXB_ENCODING, Charsets.UTF_8.name());
            // 是否省略xml头信息(<?xml version="1.0" encoding="gb2312" standalone="yes"?>)
            props.put(Marshaller.JAXB_FRAGMENT, false);
            return toXml(obj, props);
        }
    
        /**
         * java对象转xml
         *
         * @param obj   对象
         * @param props xml转换的配置熟悉
         *
         * @return xml
         */
        public static String toXml(Object obj, Map<String, Object> props) {
            if (obj == null) {
                return "";
            }
            StringWriter sw = new StringWriter();
            try {
                JAXBContext context = JAXBContext.newInstance(obj.getClass());
                Marshaller marshaller = context.createMarshaller();
    
                for (Map.Entry<String, Object> entry : props.entrySet()) {
                    String key = entry.getKey();
                    Object value = entry.getValue();
                    marshaller.setProperty(key, value);
                }
    
                marshaller.marshal(obj, sw);
            } catch (JAXBException e) {
                throw new RuntimeException("convert to Xml failed", e);
            }
            return sw.toString();
        }
    
        /**
         * 解析xml
         *
         * @param xmlStr xml
         * @param clazz  类型
         */
        public static <T> T parseXml(String xmlStr, Class<T> clazz) {
            T xmlObject;
            try {
                JAXBContext context = JAXBContext.newInstance(clazz);
                Unmarshaller unmarshal = context.createUnmarshaller();
                StringReader sr = new StringReader(xmlStr);
                //noinspection unchecked
                xmlObject = (T) unmarshal.unmarshal(sr);
            } catch (Exception e) {
                throw new RuntimeException("parse from Xml String failed", e);
            }
            return xmlObject;
        }
    
    }

    3、Java Bean 转XMl,实体类

    @Data
    @ConfigurationProperties(prefix = "wechat.cp")
    @RefreshScope
    @XmlRootElement(name = "xml")
    public class WxCpProperties {
      /**
       * 设置微信企业号的corpId
       */
      @XmlElement(name = "AppId")
      private String corpId;
    
      private List<AppConfig> appConfigs;
    
    }
    

      4、转换异常原因分析:  

    xception in thread "main" java.lang.RuntimeException: convert to Xml failed
    	at com.tencent.iov.qw.utils.XmlParseUtill.toXml(XmlParseUtill.java:74)
    	at com.tencent.iov.qw.utils.XmlParseUtill.toXml(XmlParseUtill.java:41)
    	at com.tencent.iov.qw.utils.XmlParseUtill.main(XmlParseUtill.java:47)
    Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
    类的两个属性具有相同名称 "corpId"
    	this problem is related to the following location:
    		at public java.lang.String com.tencent.iov.qw.config.WxCpProperties.getCorpId()
    		at com.tencent.iov.qw.config.WxCpProperties
    	this problem is related to the following location:
    		at private java.lang.String com.tencent.iov.qw.config.WxCpProperties.corpId
    		at com.tencent.iov.qw.config.WxCpProperties

        使用@Data注解,但是处理器同时处理访问了字段熟悉和Get方法,只需要指定处理程序只访问字段就行了

        在类上加上注解: @XmlAccessorType(XmlAccessType.FIELD) ,再次处理正常

    5、处理结果 

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <xml>
        <AppId>45166</AppId>
    </xml>
    

      

  • 相关阅读:
    Action<T>和Func<T>委托
    异步委托学习笔记
    .Net身份验证里边的几个基本概念(转)
    线程和进程
    WebClient类的使用
    关于NHibernate的更新和读取操作,及碰见的一点问题
    ASP.NET MVC 中将数据从View传递到控制器中的三种方法(表单数据绑定)
    LINQ标准查询操作符学习笔记
    C#3.0中的扩展方法
    NHibernate中的一对多映射
  • 原文地址:https://www.cnblogs.com/irobotzz/p/14336121.html
Copyright © 2011-2022 走看看