關於使用JAXB讀取xml文檔轉換為java對象報錯:類的兩個屬性具有相同名稱com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsExc...


java類如下:

package com.example.demo;

import feign.Headers;
import feign.RequestLine;
import lombok.Data;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

public interface PersonClient {

    @RequestLine("POST /person/createXML")
    @Headers("Content-Type: application/xml")
    Result createPersonXML(Person person);

    @Data
    @XmlRootElement
    class Person {
        @XmlElement
        Integer personId;
        @XmlElement
        String personName;
        @XmlElement
        int personAge;
        @XmlElement
        String message;
    }

    @Data
    @XmlRootElement
    class Result {
        @XmlElement
        String message;
    }
}

  

錯誤如下:

Exception in thread "main" feign.codec.EncodeException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 4 counts of IllegalAnnotationExceptions
類的兩個屬性具有相同名稱 "message"
	this problem is related to the following location:
		at public java.lang.String com.example.demo.PersonClient$Person.getMessage()
		at com.example.demo.PersonClient$Person
	this problem is related to the following location:
		at java.lang.String com.example.demo.PersonClient$Person.message
		at com.example.demo.PersonClient$Person
類的兩個屬性具有相同名稱 "personAge"
	this problem is related to the following location:
		at public int com.example.demo.PersonClient$Person.getPersonAge()
		at com.example.demo.PersonClient$Person
	this problem is related to the following location:
		at int com.example.demo.PersonClient$Person.personAge
		at com.example.demo.PersonClient$Person
	同以上報錯,此處省略....
	at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91)
	at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:445)
	at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277)
	at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:124)
	at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1123)
	at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:147)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:247)
	at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:234)
	at javax.xml.bind.ContextFinder.find(ContextFinder.java:462)
	at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:641)
	at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
	at feign.jaxb.JAXBContextFactory.getContext(JAXBContextFactory.java:74)
	at feign.jaxb.JAXBContextFactory.createMarshaller(JAXBContextFactory.java:56)
	at feign.jaxb.JAXBEncoder.encode(JAXBEncoder.java:58)
	... 6 more

  

原因: 類中有兩個相同的屬性名,說明會同時訪問getter方法和成員變量。
解決辦法:
在類上加上@XmlAccessorType(XmlAccessType.FIELD)注解,加上此注解后,xml的訪問類型為成員變量,而不是getter/setter方法對。

package com.example.demo;

import feign.Headers;
import feign.RequestLine;
import lombok.Data;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

public interface PersonClient {

    @RequestLine("POST /person/createXML")
    @Headers("Content-Type: application/xml")
    Result createPersonXML(Person person);

    @XmlAccessorType(XmlAccessType.FIELD)
    @Data
    @XmlRootElement
    class Person {
        @XmlElement
        Integer personId;
        @XmlElement
        String personName;
        @XmlElement
        int personAge;
        @XmlElement
        String message;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @Data
    @XmlRootElement
    class Result {
        @XmlElement
        String message;
    }
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM