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?
要解决这个问题:
- 改变你的成员的访问级别为私人,并保持你的getter / setter
- 删除成员的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; } }
希望能帮助到你!