Jaxb,Class有两个同名的属性

red*_*x26 110 java xml jaxb

使用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>
Run Code Online (Sandbox Code Playgroud)

我的课

@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;
}
}
Run Code Online (Sandbox Code Playgroud)

当我尝试读取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
Run Code Online (Sandbox Code Playgroud)

我不明白这个错误

编辑:我使用jaxb-impl-2.1.12

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

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

小智 193

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

@XmlRootElement(name="yourRootElementName")
@XmlAccessorType(XmlAccessType.FIELD)
Run Code Online (Sandbox Code Playgroud)

这将100%工作

  • 我遇到过同样的问题.甚至当我们只添加@XmlAccessorType(XmlAccessType.FIELD)时它也可以工作 (7认同)
  • 与JAXB Annotation的Inner类一样存在同样的问题.在内部类上放置@XmlAccessorType(XmlAccessType.FIELD)有效! (3认同)
  • 我通过_removing_解决了这个问题`@XmlAccessorType(XmlAccessType.FIELD)`注释 (2认同)

meg*_*hor 24

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


Sri*_*ram 21

我也看到过类似的类似问题.

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

我认为,当我们在字段级别使用@XMLElement注释并抛出IllegalAnnotationExceptions异常时,JAXB(注释处理器)将同一字段元素的成员字段和getter方法视为不同的属性 .

例外消息:

类有两个属性的的同一个 名字 "时间序列"

在Getter方法:

    at public java.util.List testjaxp.ModeleREP.getTimeSeries()
Run Code Online (Sandbox Code Playgroud)

在会员领域:

    at protected java.util.List testjaxp.ModeleREP.timeSeries
Run Code Online (Sandbox Code Playgroud)

解决方法: 如果不使用的@XmlElement现场,用它在吸气的方法.


小智 14

刚把这个添加到我的班级

@XmlAccessorType(XmlAccessType.FIELD)
Run Code Online (Sandbox Code Playgroud)

像cham一样工作


pto*_*mli 10

您的JAXB正在查看getTimeSeries()方法和成员timeSeries.您没有说明您正在使用哪个JAXB实现或其配置,但异常相当清楚.

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

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

您需要配置JAXB内容以使用注释(根据您的@XmlElement(name="TimeSeries"))并忽略公共方法.

  • 我也将(XmlAccessType.FIELD)更改为(XmlAccessType.NONE),我可以将XmlElement保留在成员级别 (4认同)

Bak*_*alf 10

有多种解决方案,但基本上,如果您对变量声明进行注释,则需要@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
}
Run Code Online (Sandbox Code Playgroud)

要么:

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

    @XmlElement(name = "STATUS")         
    public int getStatus()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

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

看看OOXS吧


小智 7

如果我们使用下面的注释并删除"@XmlElement"注释,代码应该正常工作,结果XML将具有类似于类成员的元素名称.

@XmlRootElement(name="<RootElementName>")
@XmlAccessorType(XmlAccessType.FIELD)
Run Code Online (Sandbox Code Playgroud)

如果确实需要使用"@XmlElement",请将其定义为字段级别,代码应该可以正常工作.不要在getter方法的顶部定义注释.

已经尝试了上述两种方法,并解决了这个问题.


Nao*_*Bar 7

当您有一个具有公共访问级别的类成员 x 和同一成员的 getter/setter 时,可能会发生“类有两个同名属性异常”

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

查看更多详细信息: 公共财产 VS 私有财产与 getter?

要解决这个问题:

  1. 将您成员的访问级别更改为私有并保留您的 getter/setter
  2. 移除成员的 getter 和 setter


Tay*_*ain 6

只需在要转换为 XML 的类中将成员变量声明为私有。快乐编码


Kon*_*aka 5

这些是JAXB正在关注的两个属性.

public java.util.List testjaxp.ModeleREP.getTimeSeries()  
Run Code Online (Sandbox Code Playgroud)

protected java.util.List testjaxp.ModeleREP.timeSeries
Run Code Online (Sandbox Code Playgroud)

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

@XmlElement(name="TimeSeries"))  
public java.util.List testjaxp.ModeleREP.getTimeSeries()
Run Code Online (Sandbox Code Playgroud)


Ani*_*nil 5

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

@XmlRootElement(name="yourRootElementName")

@XmlAccessorType(XmlAccessType.FIELD)
Run Code Online (Sandbox Code Playgroud)

现在它正在工作。