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>
    

      

  • 相关阅读:
    HDU4366 Successor 线段树+预处理
    POJ2823 Sliding Window 单调队列
    HDU寻找最大值 递推求连续区间
    UVA846 Steps 二分查找
    HDU3415 Max Sum of MaxKsubsequence 单调队列
    HDU时间挑战 树状数组
    UVA10168 Summation of Four Primes 哥德巴赫猜想
    UESTC我要长高 DP优化
    HDUChess 递推
    HDU4362 Dragon Ball DP+优化
  • 原文地址:https://www.cnblogs.com/irobotzz/p/14336121.html
Copyright © 2011-2022 走看看