2012-07-26 6 views
3

this과 같은 것을 얻고 싶습니다.@XmlAnyElement를 사용한 XML 매핑

<zoo> 
    <lion> ... </lion> 
    <dog> ... </dog> 
</zoo> 

여기에이 클래스가 있습니다. 같은 버튼, 콤보 상자 ... 로

public class MainGroup { 
    private List<Widget> widgets; 

    @XmlAnyElement 
    public List<Widget> getWidgets() { 
     return widgets; 
    } 
    public void setWidgets(List<Widget> widgets) { 
     this.widgets = widgets; 
    } 
} 

그리고이 위젯 슈퍼 클래스가 가지고 서브 클래스는이 같은 뭔가를 달성하고 싶습니다.

<MainGroup> 
    <Button>...</Button> 
    <Combo>...</Combo> 
</MainGroup> 

나는 @XmlElementRef를 추가이 예외

[com.sun.istack.internal.SAXException2: class com.test.Button nor any of its super 
    class is known to this context. 

를 내가 시도 데하지만 여전히 작동하지 않습니다.

@XmlElementRefs({ 
    @XmlElementRef(name="Button", type=Button.class), 
    @XmlElementRef(name="Combo", type=Combo.class) 
}) 

답변

0

좋아, 여기 것들을 꽤 많이 놓치고 있어요. 버튼과 콤보의 서브 클래스에이를 구현하기 위해이 @XmlRootElement 주석을 추가하는 것처럼 보입니다.

누구나 내 하위 클래스에서 해당 주석이 필요한 이유를 설명 할 수 있습니까? 나는 혼란 스럽습니다. XML에 @XmlRootElement이 있다고 생각합니다. 내 경우에는 MainGroup 클래스에 있어야합니다.

1

매핑하여 사용 사례 내 대답은 당신의 관련 질문 중 하나에서 수집 한 정보를 기반으로

:

당신은 당신이 할 수있는 클래스를 매핑되어 있기 때문에 소스가 없으므로 JAXB 주석을 추가 할 수 없습니다. @XmlElements 매핑을 사용하는 것이 좋습니다.

@XmlElements({ 
    @XmlElement(name="Button", type=Button.class), 
    @XmlElement(name="Combo", type=Combo.class) 
}) 
public List<Widget> getWidgets() { 
    return widgets; 
} 

@XmlElementsxsd:choice의 XML 스키마 개념에 해당한다. http://blog.bdoughan.com/2010/10/jaxb-and-xsd-choice-xmlelements.html

  • 는 약 @XmlRootElement

    좋아, 여기 것들을 꽤 많이 놓치고 있어요. 이 @XmlRootElement 주석을 Button의 하위 클래스에 추가하고 콤보를 추가하려면 을 추가하는 것 같습니다. 내 서브 클래스에서 해당 주석이 필요한 이유

    이 사람이 나에게 설명 할 수 ... 나는 혼란 스러워요, 나는 XML은 내 경우 MainGroup 클래스에 있어야 할 @XmlRootElement있을 거라 생각 했어요.

    @XmlRootElement는 비 정렬 된 문서의 루트 요소 그 이상을 포함하는 XML 스키마 글로벌 요소에 해당합니다.@XmlElementRef

    @XmlElementRef

    가 대체 그룹의 개념에 해당한다 : 나는 아래의 역할의 몇 가지를 설명 할 것이다. XML 스키마에서 하나의 전역 요소를 다른 요소로 대체 ​​할 수 있도록 지정할 수 있습니다. JAXB @XmlRootElement (및 @XmlElementDecl를)에서 글로벌 요소를 지정하는 데 활용된다

    @XmlAnyElement

    @XmlAnyElement는 XS의 개념에 해당 XML Schena의 모든. 이것은 꽤 자유로운 형태의 문서의 일부입니다. JAXB에서 @XmlAnyElement(lax=true)으로 등록 정보를 매핑하면 @XmlRootElement 선언과 일치하는 요소가 해당 도메인 객체로 변환됩니다.

+0

내 관련 게시물의 위젯은 이클립스 SWT에서입니다. 이 위젯 클래스는 자체 생성 클래스이고 Button.class 및 Combo.class는 위젯 클래스의 하위 클래스입니다. @XmlElementRefs (name = "Combo", type = Combo.class) }})'@XmlElementRefs ({ @XmlElementRef (name = "Button", type = Button.class), } – humansg