[java] 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가 null입니다 …

그래서 jaxb가 flx에 문제가있는 것 같나요?



답변

나는 또한 이와 같은 문제에 직면했고 이것을 설정했습니다.

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

이것은 100 % 작동합니다


답변

사용중인 JAXB-IMPL 버전을 지정하지 않았지만 동일한 문제 (jaxb-impl 2.0.5 사용)가 발생하고 멤버 수준에서 사용하는 대신 getter 수준에서 주석을 사용하여 해결했습니다.


답변

나는 또한 이와 같은 유사한 문제를 보았습니다.

(bean) 클래스에서 ” @XMLElement주석 을 사용하는 때문이라고 생각합니다 .

그리고 JAXB (주석 처리기) 는 필드 수준 에서 @XMLElement 주석을 사용 하고 IllegalAnnotationExceptions 예외를 throw 할 때 동일한 필드 요소의 멤버 필드 및 getter 메서드를 다른 속성으로 간주한다고 생각합니다 .

예외 메시지 :

클래스에는 “timeSeries” 라는 동일한 이름두 속성 이 있습니다.

Getter 메서드에서 :

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

회원 필드에서 :

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

솔루션 : 필드 에서 @XmlElement
를 사용하는 대신 getter 메서드 에서 사용하십시오 .


답변

내 수업에 이것을 추가했습니다.

@XmlAccessorType(XmlAccessType.FIELD)

참처럼 일했다


답변

여러 솔루션이 있지만 기본적으로 변수 선언에 주석을다는 경우는 필요 @XmlAccessorType(XmlAccessType.FIELD)하지만 get- 또는 set-method에 주석을 추가하려면 그렇지 않습니다.

따라서 다음을 수행 할 수 있습니다.

@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()
    {
    }
}


답변

JAXB는 getTimeSeries()메소드와 멤버 모두를보고 timeSeries있습니다. 어떤 JAXB 구현을 사용하고 있는지 또는 그 구성을 말하지 않지만 예외는 상당히 분명합니다.

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

보호 된 java.util.List testjaxp.ModeleREP.timeSeries에서

주석을 사용 @XmlElement(name="TimeSeries")하고 공용 메서드를 무시 하도록 JAXB 항목을 구성해야 합니다.


답변

class ModeleREP@XmlAccessorType(XmlAccessType.FIELD)마찬가지로 class를 구성해야합니다 TimeSeries.

OOXS 살펴보기