2010-03-03 5 views
4

기존에 XmlElements를 재정의하는 방법 :입니다자바 JAXB는 JAXB를 사용하여 비 정렬 화 때, 나는 수업을 따라 뭔가가 변수

public class A { 
    @XmlElements({ // 
    @XmlElement(name = "g", type = A.class), 
     @XmlElement(name = "x", type = X.class), 
     @XmlElement(name = "y", type = Y.class),   
    }) 
    List<XXX> children; 
} 

을, 내가 가진 목록, 어린이, X 구성 : S와 Y : 내 질문에 대한 지금의

: 나는 하위 클래스 싶습니다, 나는 처럼 'XmlElements'목록을 재정의하고, '아이'같은 변수에 바인딩 싶습니다 :

public class B extends A { 
    @XmlElements({ // 
    @XmlElement(name = "g", type = B.class), 
     @XmlElement(name = "x", type = X.class), 
     @XmlElement(name = "y", type = Y.class), 
     @XmlElement(name = "z", type = Z.class),   
    }) 
    List<XXX> children; 
} 
위와개

이슈는 두 가지이다 :

  1. 나는 새로운 변수 아이를 작성

    , 나는 클래스 A의 변수를 참조하고 싶은

  2. 나는 'X를 재지 정하는 피하기 위해 같은 것 '및'y '는'A '에 이미 지정되어 있기 때문입니다.

이렇게하려면 좋은 패턴이 있습니까?

또는 몇 가지 포인터/기사 또는 이와 유사한 것을 구축하는 방법에 대한 기타 정보?

답변

1

더는 주석의 재 선언을 피할 수 없다,하지만 당신은 오히려 공공 게터 방법을 찾기 위해 JAXB를 말할만큼 당신이 @XmlAccessorType 주석을 사용할 때, getter 메소드에의 필드에서 주석을 이동할 수 있습니다 필드보다.

@XmlAccessorType(PROPERTY) 
public class A { 
    private List<XXX> children; 

    @XmlElements({ // 
    @XmlElement(name = "g", type = A.class), 
     @XmlElement(name = "x", type = X.class), 
     @XmlElement(name = "y", type = Y.class),   
    }) 
    public List<XXX> getChildren() { 
     return children; 
    } 

    public void setChildren(List<XXX> children) { 
     this.children = children; 
    } 
} 

@XmlAccessorType(PROPERTY) 
public class B extends A { 
    @XmlElements({ // 
    @XmlElement(name = "g", type = B.class), 
     @XmlElement(name = "x", type = X.class), 
     @XmlElement(name = "y", type = Y.class), 
     @XmlElement(name = "z", type = Z.class),   
    }) 
    public List<XXX> getChildren() { 
     return super.getChildren(); 
    } 
} 

는 내가 확실하지 않다하는 JAXB가 오버라이드 (override) getChildren() 방법을 처리하는 방법입니다 :

그래서 당신은 B 재치 클래스의 새 주석 세트를 getChildren()를 오버라이드 (override) 할 수있다. 아마 B에서 주석을 가져 오지 만 혼란 스러울 수도 있습니다.

시도해보십시오.

+1

아, 아주 멋지다. 나는 주석 필드를 getter 필드로 옮길 수 있다는 것을 몰랐다! 나는 그것을 즉시 시도 할 것이다, 그것이 작동한다면 그것은 내 현재의 문제에 대해 절대적으로 좋은 이다. 많은 분들께 감사 드리며, 설명해 드리겠습니다. –

+0

그럼 작동 했나요? - "잘하면", "시도 할 것"이 많이 있습니다. 문제의 사실은, 나는 비슷한 문제가 있고,이 솔루션은 내 상황에서 작동하지 않는 것 같습니다. – bvdb

1

JAXB는 실제로 PROPERTY @XmlAccessorType이 부모에서 사용되지만 결과 xml 데이터에서 JAXB가 다음과 같은 루트 태그 속성을 추가로 생성 할 때 overriden 메소드를 처리합니다. xsi : type = "B "Xmlns : xsi ="http://www.w3.org/2001/XMLSchema-instance ", A에서 상속받은 새로운 유형 B를 정의했기 때문에 클래스 A에서 생성 된 xml은 생성 된 것과 동일하지 않습니다 정확하게 우리가 추가 타입 B를 정의 있음을 알리기 위해 JAXB에 의해 추가 된 두 속성의

나는이 XSI의 xmlns를 방지 할 수있는 방법을보고 싶습니다

통보하기 때문에 클래스 B에서 출력 xml의 ation. JAXB의 이런 동작은 완벽하지만 괜찮았다. 필자가 클라이언트 xsd 스키마에서 가져온 원래 클래스를 확장 한 클래스를 만든 것은 내 XML 출력에서 ​​수신기에 알리지 않는 것이 좋을 것이다.

파생 서브 클래스에서 XML을 생성하려면하지만 XSI의 xmlns O를 속성이 JAXB 추가/나는 더 좋은 뭔가를 교환하기 위해 노력하고 일시적 트릭을 사용 W : 나는 부모에서 자식으로 방법의 재정의를했다 overriden 메서드 @XmlElement를 사용해야했지만 JAXB.newinstance 호출에 상속 된 클래스 형식을 추가하지 않았습니다.

+0

이렇게하면 마샬링이 작동하지만 자식은 부모 클래스 당 한 번, 하위 클래스 (B)에서 한 번 두 번 마샬링됩니다. JAXB에게 마샬링 프로세스에서 겹쳐 써진 속성 (getter 포함)을 이와 같이 처리해야한다고 말하는 방법이 있습니까? – basZero

관련 문제