Jaxb,Class有两个同名的属性

与jaxb,我尝试读取一个XML文件只有在XML文件中的几个元素是有趣的,所以我想跳过很多元素

XML内容

XML我尝试阅读

<?xml version="1.0" encoding="UTF-8"?> <!--Sample XML file generated by XMLSpy v2010 rel. 3 sp1 (http://www.altova.com)--> <flx:ModeleREP xsi:schemaLocation="urn:test:mod_rep.xsd mod_rep.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:flx="urn:test:mod_rep.xsd"> <flx:DocumentHeader> <flx:Identification v="04489"/> </flx:DocumentHeader> <flx:TimeSeries> <flx:Identification v="test1a"/> <flx:BusinessType v="A01"/> <flx:Product v="123a"/> <flx:ResourceObject codingScheme="N" v="testa"/> <flx:Period> <flx:TimeInterval v="2011-07-02T00:00/2011-07-16T00:00"/> <flx:Resolution v="PT2H"/> <flx:Pt> <flx:P v="1"/> <flx:Q unitCode="String" v="1.0"/> <flx:A currencyIdentifier="String" v="195.0"/> </flx:Pt> </flx:Period> </flx:TimeSeries> <flx:TimeSeries> <flx:Identification v="test2a"/> <flx:BusinessType v="A01"/> <flx:Product v="a123b"/> <flx:ResourceObject codingScheme="N" v="test2"/> <flx:Period> <flx:TimeInterval v="2011-07-02T00:00/2011-07-16T00:00"/> <flx:Resolution v="PT2H"/> <flx:Pt> <flx:P v="1"/> <flx:Q unitCode="String" v="1.0"/> <flx:A currencyIdentifier="String" v="195.0"/> </flx:Pt> <flx:Pt> <flx:P v="2"/> <flx:Q unitCode="String" v="1.0"/> <flx:A currencyIdentifier="String" v="195.0"/> </flx:Pt> </flx:Period> </flx:TimeSeries> </flx:ModeleREP> 

我的课

 @XmlRootElement(name="ModeleREP", namespace="urn:test:mod_rep.xsd") public class ModeleREP { @XmlElement(name="TimeSeries") protected List<TimeSeries> timeSeries; public List<TimeSeries> getTimeSeries() { if (this.timeSeries == null) { this.timeSeries = new ArrayList<TimeSeries>(); } return this.timeSeries; } public void setTimeSeries(List<TimeSeries> timeSeries) { this.timeSeries = timeSeries; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "TimeSeries") public class TimeSeries { @XmlElement(name="ResourceObject") protected RessourceObject resourceObject; @XmlElement(name = "Period") protected Period period; public RessourceObject getResourceObject() { return this.resourceObject; } public void setResourceObject(RessourceObject resourceObject) { this.resourceObject = resourceObject; } public Period getPeriod() { return this.period; } public void setPeriod(Period period) { this.period = period; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "ResourceObject") public class RessourceObject { @XmlAttribute(name = "codingScheme") protected String codingScheme; @XmlAttribute(name = "v") protected String v; public String getCodingScheme() { return this.codingScheme; } public void setCodingScheme(String codingScheme) { this.codingScheme = codingScheme; } public String getV() { return this.v; } public void setV(String v) { this.v = v; } } @XmlAccessorType(XmlAccessType.NONE) @XmlRootElement(name = "Period") public class Period { @XmlElement(name = "TimeInterval") protected TimeInterval timeInterval; @XmlElement(name = "Pt") protected List<Pt> pt; public TimeInterval getTimeInterval() { return this.timeInterval; } public void setTimeInterval(TimeInterval timeInterval) { this.timeInterval = timeInterval; } public List<Pt> getPt() { if (this.pt == null) { this.pt = new ArrayList<Pt>(); } return this.pt; } public void setPt(List<Pt> pt) { this.pt=pt; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "TimeInterval") public class TimeInterval { @XmlAttribute(name = "v") private String timeIntervalPeriod; public String getTimeIntervalPeriod() { return this.timeIntervalPeriod; } public void setTimeIntervalPeriod(String timeIntervalPeriod) { this.timeIntervalPeriod = timeIntervalPeriod; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "Pt") public class Pt { @XmlElement(name = "P") protected P p; @XmlElement(name = "A") protected A a; public P getP() { return this.p; } public void setP(P p) { this.p = p; } public A getA() { return this.a; } public void setA(A a) { this.a = a; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "P") public class P { @XmlAttribute(name = "v") protected String position; public String getPosition(){ return this.position; } public void setPosition(String position){ this.position=position; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "A") public class A { @XmlAttribute(name = "v") protected String calculatedAmount; public String getCalculatedAmount() { return this.calculatedAmount; } public void setCalculatedAmount(String calculatedAmount) { this.calculatedAmount = calculatedAmount; } } 

当我尝试读取xlm文件我得到

 com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions Class has two properties of the same name "timeSeries" this problem is related to the following location: at public java.util.List testjaxp.ModeleREP.getTimeSeries() at testjaxp.ModeleREP this problem is related to the following location: at protected java.util.List testjaxp.ModeleREP.timeSeries at testjaxp.ModeleREP 

我不明白这个错误

编辑:我使用jaxb-impl-2.1.12

好吧,现在我没有任何错误,但是当我检查我的对象,timeSeries为空…

所以也许jaxb似乎有flx的问题?

我也面临这样的问题,我设置了这个。

 @XmlRootElement(name="yourRootElementName") @XmlAccessorType(XmlAccessType.FIELD) 

这将100%

你没有指定你使用的是什么JAXB-IMPL版本,但是一旦我有同样的问题(使用jaxb-impl 2.0.5),并且在getter级别使用注解解决它,而不是在成员级使用它。

我也看到了一些类似的问题。

我认为,这是因为我们在(bean)类中使用“ @XMLElement注释地方

我认为,当我们在字段级使用@XMLElement注解并抛出IllegalAnnotationExceptionexception时, JAXB (注解处理器)将相同字段元素的成员字段&getter方法视为不同的属性。

exception消息:

类有两个 同名的 属性 “timeSeries”

在Getter方法:

  at public java.util.List testjaxp.ModeleREP.getTimeSeries() 

在会员领域:

  at protected java.util.List testjaxp.ModeleREP.timeSeries 

解决scheme:不要在字段中使用@XmlElement ,而是在getter方法中使用它。

您的JAXB正在查看getTimeSeries()方法和成员timeSeries 。 你没有说你正在使用哪个JAXB实现,或者它的configuration,但是这个例外是相当清楚的。

在public java.util.List testjaxp.ModeleREP.getTimeSeries()

在受保护的java.util.List testjaxp.ModeleREP.timeSeries

你需要configuration你的JAXB的东西使用注释(根据您的@XmlElement(name="TimeSeries") ),并忽略公共方法。

您需要像使用@XmlAccessorType(XmlAccessType.FIELD)ModeleREP ,使用@XmlAccessorType(XmlAccessType.FIELD)configuration类ModeleREP

看看OOXS

如果我们使用下面的注释并删除“@XmlElement”注释,则代码应该正常工作,并且生成的XML将具有与类成员类似的元素名称。

 @XmlRootElement(name="<RootElementName>") @XmlAccessorType(XmlAccessType.FIELD) 

如果真的需要使用“@XmlElement”,请将其定义为字段级别,代码应该完美工作。 不要在getter方法的顶部定义注释。

已经尝试了上面提到的方法,并得到解决这个问题。

只需要在要转换为XML的类中将成员variables声明为private即可。 快乐的编码

这些是JAXB正在研究的两个属性。

 public java.util.List testjaxp.ModeleREP.getTimeSeries() 

 protected java.util.List testjaxp.ModeleREP.timeSeries 

这可以通过在get方法中使用JAXB注释来避免,就像下面提到的一样。

 @XmlElement(name="TimeSeries")) public java.util.List testjaxp.ModeleREP.getTimeSeries() 

我刚刚遇到了这个问题,并解决了它。

问题的根源在于你有两个XmlAccessType.FIELD和一对getter和setter。 解决的办法是删除setter,并添加一个默认的构造函数和一个构造函数,它接受所有的字段。

当有一个具有公共访问级别的类成员x和同一个成员的getter / setter时, “Class有两个同名exception的属性”

作为一个java的经验法则,不build议与getter和setter一起使用公共访问级别。

检查这个更多的细节: 公共财产VS私人财产与getter?

要解决这个问题:

  1. 改变你的成员的访问级别为私人,并保持你的getter / setter
  2. 删除成员的getter和setter

只是添加到我的class

 @XmlAccessorType(XmlAccessType.FIELD) 

工作像一个湛

同样的问题,我面对,我补充说

 @XmlRootElement(name="yourRootElementName") @XmlAccessorType(XmlAccessType.FIELD) 

现在它正在工作。

我有一个签名如下的服务类“

 @WebMethod public FetchIQAStatusResponseVO fetchIQAStatus(FetchIQAStatusRequest fetchIQAStatusRequest) { 

运行时,我得到了同样的错误FetchIQAStatusResponseVO领域。 我只是在FetchIQAStatusResponseVO上添加一行:

 @XmlAccessorType(XmlAccessType.FIELD) //This line added public class FetchIQAStatusResponseVO { 

这解决了这个问题。

@XmlTransient注释可以解决这个问题

 @XmlTransient public void setTimeSeries(List<TimeSeries> timeSeries) { this.timeSeries = timeSeries; } 

查看http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlTransient.html了解更多详情;

解决此问题的一个简单而快速的方法是从variables声明语句protected List<TimeSeries> timeSeries;的顶部删除@XmlElement(name="TimeSeries") protected List<TimeSeries> timeSeries; 到它的getter的顶部, public List<TimeSeries> getTimeSeries()

因此,您的ModeleREP类将如下所示:

 @XmlRootElement(name="ModeleREP", namespace="urn:test:mod_rep.xsd") public class ModeleREP { protected List<TimeSeries> timeSeries; @XmlElement(name="TimeSeries") public List<TimeSeries> getTimeSeries() { if (this.timeSeries == null) { this.timeSeries = new ArrayList<TimeSeries>(); } return this.timeSeries; } public void setTimeSeries(List<TimeSeries> timeSeries) { this.timeSeries = timeSeries; } } 

希望能帮助到你!