2011-07-20 144 views
82

与JAXB,我尝试读取XML文件 只有在XML文件中的一些元素是有趣的,所以我想跳过许多元素JAXB,类具有相同名称的两个属性

xml content

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的问题?

回答

10

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

在公众的java.util.List testjaxp.ModeleREP.getTimeSeries()

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

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

+0

我已经这样做了:@XmlElement(NAME = “TimeSeries”) 受保护列表 timeSeries; – redfox26

+3

另外我更改(XmlAccessType.FIELD)为(XmlAccessType.NONE),我可以保留XmlElement在成员级别 – redfox26

+0

感谢您的正确解释;) –

19

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

+0

这是正确的我刚刚删除成员的注释并将其放在setter级别和它工作。 – Varun

3

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

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

protected java.util.List testjaxp.ModeleREP.timeSeries 

这可以通过使用JAXB标注在仿如下面提到get方法来避免。

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

您需要配置ModeleREP类以及与@XmlAccessorType(XmlAccessType.FIELD)为您TimeSeries类一样。

有无人看OOXS

145

我也面临类似问题,这一点,我设置。

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

这将工作100%

+4

我有同样的问题。甚至当我们仅添加@XmlAccessorType(XmlAccessType.FIELD)时,它也能正常工作 –

+2

我通过_removing_'@XmlAccessorType(XmlAccessType.FIELD)'注释解决了这个问题 –

+0

听起来很奇怪,但我也通过减少注释对 \ @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) 仅限于 \ @XmlRootElement –

2

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

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

+0

我有同样的错误,你提到的注释解决了它,谢谢! – gyorgyabraham

12

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

我认为,这是因为地方的,我们用“@XmlElement注释在(豆)类。

我认为,该JAXB(注释处理器)认为相同的字段元素作为不同性质的成员字段&吸气剂的方法,当我们使用@XmlElement注释在字段水平和投IllegalAnnotationExceptions异常。

异常消息:

类具有两个属性的相同 “时间序列”

在getter方法的

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

在成员字段:

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

解决方案:领域使用@XmlElement相反,在吸气方法使用它。

0

@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更多细节

+1

我认为这比解决方案更具破坏性。这告诉jaxb忽略该方法,而不是让它知道它是同一件事。 –

+0

黑客或不是这是最好的解决方案来解决一些不能被描述为缺少bug的东西,我使用了@XmlAccessorType(XmlAccessType.FIELD),它被忽略了,并且为每个属性添加@XmlTransient是唯一的方法来修复这个问题。谢谢! –

2

我面临同样的问题,我补充

@XmlRootElement(name="yourRootElementName") 

@XmlAccessorType(XmlAccessType.FIELD) 

,现在它的工作。。

1

我有签名服务类,如下”

@WebMethod 
public FetchIQAStatusResponseVO fetchIQAStatus(FetchIQAStatusRequest fetchIQAStatusRequest) { 

上运行我得到了同样的错误FetchIQAStatusResponseVO领域我刚才添加的FetchIQAStatusResponseVO在上面的一行:

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

和这解决了这个问题

7

如果我们使用下面的注释并删除“@XmlElement”注释,代码应该可以正常工作,并且生成的XML会有e类似于班级成员的名字。

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

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

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

4

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

+1

这实际上解决了我的问题 –

+0

这应该是公认的解决方案。如果你声明你的成员变量是公开的,除了getter/setter带注释的方法外,JABX将解析它并吐出异常。 这是一个很好的例子,jabx图书馆设计师在反思中进一步努力创造灵活性并最终导致无效配置。我自己修改了一行代码,然后回溯到成员变量,从而解决了问题。 – Vortex

0

一个快速和简单的方式来解决这个问题是从变量声明语句protected List<TimeSeries> timeSeries;的顶部去除@XmlElement(name="TimeSeries")其吸气剂,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; 
    } 
} 

希望它能帮助!

2

“类具有相同的名称异常两个属性”当你有一个公共的访问级别,并为同一部件的getter/setter类成员x可能发生。作为一个java的经验法则,不建议使用访问级别与getter和setter一起使用public

检查此了解更多详情: Public property VS Private property with getter?

为了解决这个问题:

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

刚刚添加到我的课

@XmlAccessorType(XmlAccessType.FIELD) 

工作就像一个湛

0

它会在你的干将之前把你的注释工作,并从受保护的属性中删除:

protected String codingScheme; 

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