类有两个同名的属性

对于 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 是 null..。

也许 Jaxb 对 flx 有意见?

147686 次浏览

您的 JAXB 正在查看 getTimeSeries()方法和成员 timeSeries。您没有说明您正在使用哪个 JAXB 实现,或者它的配置,但是异常是相当明显的。

列出 testjaxp. ModelREP.getTimeSeries ()

还有

列出 testjaxp. ModelREP.timeSeries

您需要将 JAXB 配置为使用注释(根据 @XmlElement(name="TimeSeries"))并忽略公共方法。

您没有指定使用哪个 JAXB-IMPL 版本,但是有一次我遇到了同样的问题(使用 JAXB-IMPL 2.0.5) ,并且在 getter 级别使用注释解决了这个问题,而不是在成员级别使用注释。

这是 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()

您需要使用 @XmlAccessorType(XmlAccessType.FIELD)配置类 ModeleREP,就像使用类 TimeSeries一样。

看看 OOXS

我也遇到过这样的问题,我设置了这个。

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

百分之百有效

我只是碰到了这个问题,并解决了它。

问题的根源在于您同时拥有 XmlAccessType.FIELD 和一对 getter 和 setter。解决方案是删除 setter 并添加一个缺省构造函数和一个构造函数,该构造函数接受所有字段。

我也看到过类似的问题。

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

我认为,当我们在 场地级使用 @ XMLElement注释并抛出 非法注释例外异常时,JAXB(注释处理器)会将同一字段元素的成员 field & getter 方法作为不同的属性考虑。

例外信息:

类具有 同一个人 姓名“ timeSeries”的 两处房产

返回文章页面返回文章页面返回文章页面返回文章页面返回文章页面返回文章页面

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

会员区:

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

解决方案: 不要在 场地中使用 @ XmlElement ,而是在 Getter方法中使用它。

使用 @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了解更多细节

我补充说,我也遇到过同样的问题

@XmlRootElement(name="yourRootElementName")


@XmlAccessorType(XmlAccessType.FIELD)

现在起作用了。

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

@WebMethod
public FetchIQAStatusResponseVO fetchIQAStatus(FetchIQAStatusRequest fetchIQAStatusRequest) {

在运行的时候,我得到了相同的 FetchIQAStatusResponseVO字段错误。我只是在 FetchIQAStatusResponseVO上面添加了一行:

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

这就解决了问题。

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

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

如果确实需要使用“@XmlElement”,请将其定义为字段级别,代码应该能够很好地工作。不要在 getter 方法的顶部定义注释。

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

只需在要转换为 XML 的类中将成员变量声明为 private 即可。 编程愉快

解决这个问题的一个快速而简单的方法是将 @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;
}
}

希望能有帮助!

当您有一个具有公共访问级别的类成员 x 和同一成员的 getter/setter 时,可能会发生“ Class has two properties of the same name eption”

作为 Java 的经验法则,不建议将 公众人士访问级别与 getter 和 setter 一起使用。

查看更多细节: 公有财产 VS 私有财产与吸气剂? ?

为了解决这个问题:

  1. 将成员的访问级别更改为 二等兵,并保留 getter/setter
  2. 删除成员的 getter 和 setter

刚把这个加到我的课上

@XmlAccessorType(XmlAccessType.FIELD)

非常有效

当您将注释放在 getter 之前,并将其从受保护属性中删除时,它将工作:

protected String codingScheme;


@XmlAttribute(name = "codingScheme")
public String getCodingScheme() {
return this.codingScheme;
}

有多种解决方案,但基本上如果您在变量声明上进行注释,那么您需要 @XmlAccessorType(XmlAccessType.FIELD),但是如果您更喜欢对 get 或 set 方法进行注释,则不需要。

所以你可以这样做:

@XmlRootElement(name="MY_CLASS_A")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyClassA
{
@XmlElement(name = "STATUS")
private int status;
//.. and so on
}

或者:

@XmlRootElement(name="MY_CLASS_A")
public class MyClassA
{
private int status;


@XmlElement(name = "STATUS")
public int getStatus()
{
}
}

ModeleREP#getTimeSeries()必须与 @Transient注释。这将有所帮助。

我反复试验并得出结论,你只需要同时使用 @XMLElement@XmlAccessorType(XmlAccessType.FIELD)

什么时候用哪个?

Case 1 : 如果要在 xml 文件中使用的字段名和元素名不同,那么必须使用 @XMLElement(name="elementName")。因为这将使用元素名绑定字段并在 XML 文件中显示。

Case 2 : 如果 xml 中的字段名和各自的元素名相同,那么您可以简单地使用 @XmlAccessorType(XmlAccessType.FIELD)

已经给出了许多解决方案,并且@Sriram 和@ptomli 也简要地触及了内部结构。我只是想添加一些对源代码的引用,以帮助理解底下发生了什么。

默认情况下(即,除了根类中的 @XmlRootElement之外,根本不使用任何额外的注释) ,JABX 试图通过两种方式对公开的内容进行编组:

  1. 公共 田野
  2. Getter 方法 ,按照 大会命名,并具有相应的 setter 方法。

注意,如果一个字段是(或者方法返回) null,它将不会写入输出。

现在,如果使用 @XmlElement,非公共事物(可以是字段或 getter 方法)也可以进行封送处理。

但是这两种方法,即字段和 getter 方法,不能相互冲突,否则就会得到 例外