programing

Jaxb, 클래스에 동일한 이름의 속성이 두 개 있습니다.

bestcode 2022. 11. 8. 21:50
반응형

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>

우리 반

@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-120-2.12를 사용합니다.

ok 이제 오류는 없지만 객체를 확인해보니 timeSeries가 null입니다...

잭스가 플랙스에 문제가 있는 것 같진 않아요?

나도 이런 문제에 직면해서 이렇게 설정했어.

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

이것은 100% 동작합니다.

사용하고 있는 JAXB-IMPL 버전을 지정하지 않았습니다만, 같은 문제(jaxb-impl 2.0.5)가 발생하여 멤버레벨이 아닌 getter레벨에서 주석을 사용하여 해결했습니다.

이 있지만 을 다는 에는 ' 선언'이 필요합니다.@XmlAccessorType(XmlAccessType.FIELD), 중 을 붙이고 get-mail, get-mail, get-mail set-mail, set-mail, set-mail, set-mail, set-mail 등입니다.

다음과 같은 작업을 수행할 수 있습니다.

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

이와 같은 유사한 문제도 몇 가지 보았습니다.

아마 (bean)클래스에서 '@XMLement' 주석을 사용하는 곳 때문인 것 같습니다.

필드 레벨에서 @XMLement 주석을 사용하여 Illigal Annotation을 던지면 JAXB(주석 프로세서)는 동일한 필드 요소의 멤버필드와 getter 메서드를 다른 속성으로 간주합니다.예외입니다.

예외 메시지:

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

Getter 메서드:

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

[멤버 필드(Member Fat Member Field:

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

해결책 : 필드에서 @XmlElement를 사용하는 대신 getter 메서드에서 사용합니다.

방금 이것을 우리 반에 추가했다.

@XmlAccessorType(XmlAccessType.FIELD)

부지런히 일하다

는 JAXB를 .getTimeSeries() 및 " " method method"timeSeries사용하고 있는 JAXB의 실장이나 그 구성에 대해서는 말하지 않지만, 예외는 매우 명확합니다.

public java.http:/flash:/etctestjaxp를 나열합니다.ModeleREP.getTimeSeries()

그리고.

보호되고 있는 java.displaces로 설정합니다.testjaxp를 나열합니다.ModeleREP.timeSeries

(JAXB 설명에 @XmlElement(name="TimeSeries") 및 퍼블릭메서드를 무시합니다.

설정을 .ModeleREP와 마찬가지로@XmlAccessorType(XmlAccessType.FIELD) TimeSeries.

OOXS를 항상 봐주세요

아래 주석을 사용하여 "@XmlElement" 주석을 제거하면 코드가 올바르게 작동하고 결과 XML은 클래스 멤버와 유사한 요소 이름을 가집니다.

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

"@XmlElement"를 사용해야 하는 경우 필드 레벨로 정의하여 코드가 완벽하게 작동해야 합니다.getter 메서드의 맨 위에 주석을 정의하지 마십시오.

위의 두 가지 방법을 모두 시도하여 문제를 해결했습니다.

"class has two properties of the same exception"은 퍼블릭액세스 레벨을 가진 클래스 멤버x와 같은 멤버의 getter/setter가 있는 경우에 발생할 수 있습니다.

Java의 경험치로서 퍼블릭액세스 레벨을 getter 및 setter와 함께 사용하는 것은 권장되지 않습니다.

자세한 내용은 이 항목을 확인하십시오: 공용 자산 VS getter가 있는 개인 자산?

이 문제를 해결하려면:

  1. 멤버의 액세스 레벨을 비공개로 변경하고 getter/setter를 유지합니다.
  2. 부재의 게터 및 세터를 제거합니다.

이것들은 JAXB가 보고 있는2가지 속성입니다.

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

XML로 변환할 클래스의 멤버 변수를 비공개로 선언하기만 하면 됩니다.해피 코딩

내가 직면했던 것과 같은 문제라고 나는 덧붙였다.

@XmlRootElement(name="yourRootElementName")

@XmlAccessorType(XmlAccessType.FIELD)

이제 효과가 있어요.

나는 방금 이 문제에 부딪혀서 해결했다.

문제의 원인은 XmlAccessType을 모두 사용하고 있기 때문입니다.필드 및 게터 및 세터 쌍.해결책은 세터를 삭제하고 기본 생성자와 모든 필드를 포함하는 생성자를 추가하는 것입니다.

주석을 getter 앞에 놓고 보호된 특성에서 제거하면 작동합니다.

protected String codingScheme;

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

다음과 같은 서명이 있는 서비스 클래스를 수강했습니다.

@WebMethod
public FetchIQAStatusResponseVO fetchIQAStatus(FetchIQAStatusRequest fetchIQAStatusRequest) {

실행 중에 동일한 오류가 발생했습니다.FetchIQAStatusResponseVO[ ]를 클릭합니다.위에 한 줄만 더 넣었어요.FetchIQAStatusResponseVO:

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

이것으로 문제가 해결되었습니다.

ModeleREP#getTimeSeries()와 함께 있어야 한다@Transient주석입니다.그게 도움이 될 거야.

주석 달기@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 를 참조해 주세요.

이 문제를 빠르고 간단하게 해결할 수 있는 방법은@XmlElement(name="TimeSeries")변수 선언문 맨 위에서protected List<TimeSeries> 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;
  }
}

도움이 됐으면 좋겠다!

시행착오를 해보니 어느 한쪽만 사용하면 된다는 결론을 얻었다.@XMLElement또는@XmlAccessorType(XmlAccessType.FIELD).

언제 사용할까요?

케이스 1 : xml 파일에서 사용하는 필드 이름과 요소 이름이 다를 경우 를 사용해야 합니다.@XMLElement(name="elementName") 해당 가 바인딩되어 됩니다. 이렇게 하면 해당 요소 이름으로 필드가 바인딩되어 XML 파일에 표시됩니다.

케이스 2 : xml 내의 필드 이름과 각 요소 이름이 모두 동일한 경우 간단히 사용할 수 있습니다.@XmlAccessorType(XmlAccessType.FIELD)

많은 솔루션이 제공되어 내부도 @Siram과 @ptomli에 의해 잠깐 만져집니다.소스코드에 대한 몇 가지 참조를 추가하여 후드 아래에서 무슨 일이 일어나고 있는지 이해하려고 합니다.

「」를 제외하고, 의 주석은 )@XmlRootElement루트 클래스)의 경우, JABX는 다음의 2개의 방법으로 공개되는 것을 정리하려고 합니다.

  1. 공공장소
  2. 규칙에 따라 명명된 getter 메서드로, 대응하는 setter 메서드를 가집니다.

반환한다)인 .null이치노

,의 ,@XmlElement를 사용하면 공개되지 않은 것(필드 또는 getter 메서드)도 마샬링할 수 있습니다.

그러나 두 가지 방법, 즉 필드와 getter-method가 서로 충돌해서는 안 됩니다.그렇지 않으면 예외가 발생합니다.

언급URL : https://stackoverflow.com/questions/6768544/jaxb-class-has-two-properties-of-the-same-name

반응형