2010-03-15 2 views
4

다음 사례를 작성했습니다. 모든 JAXBLists위한 인터페이스 :JAXB를 사용하여 목록 비 정렬 화/마샬링 <String> - 상속

public interface JaxbList<T> { 
public abstract List<T> getList(); 
} 

와 기본 구현 :

@XmlRootElement(name="list") 
public class JaxbBaseList<T> implements JaxbList<T>{ 
    protected List<T> list; 

    public JaxbBaseList(){} 

    public JaxbBaseList(List<T> list){ 
     this.list=list; 
    } 

    @XmlElement(name="item") 
    public List<T> getList(){ 
     return list; 
    } 
} 

뿐만 아니라 URI 목록의 구현 :

@XmlRootElement(name="uris") 
public class JaxbUriList2 extends JaxbBaseList<String> { 

    public JaxbUriList2() { super(); } 
    public JaxbUriList2(List<String> list){ 
     super(list); 
    } 


    @Override 
    @XmlElement(name="uri") 
    public List<String> getList() { 
     return list; 
    } 
} 

그리고이 목록을 사용하고 있습니다 다음과 같은 방법으로 :

public JaxbList<String> init(@QueryParam("amount") int amount){ 

     List<String> entityList = new Vector<String>(); 
     ... 
     enityList.add("http://uri"); 
    ... 
     return new JaxbUriList2(entityList); 
    } 
<uris> 
<uri> 
http://uri 
</uri> 
... 
</uris> 

를하지만이 같은 것입니다 :나는 출력해야한다 생각 나는 그것이 상속 함께 할 수있는 뭔가가 있다고 생각하지만, 나는 그것을 얻지 않는다

<uris> 
<item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string"> 
http://uri 
</item> 
... 
<uri> 
http://uri 
</uri> 
... 
</uris> 

...

무엇이 문제입니까? 어떻게 해결할 수 있습니까?

미리 감사드립니다.

답변

2

주석은 리플렉션을 통해 얻습니다. 특수 효과는 정의 된 유형에 바인딩됩니다.

이 동작은 반사 메커니즘 자체가 원인이 아닙니다. JAXB 프레임 워크가 수퍼 클래스 인 클래스의 메서드에 대한 주석을 명시 적으로 나열하는 것처럼 보입니다. 놀랍게도 이것은 여전히 ​​효과가 있지만 원하는 것은 아닙니다.

기본 클래스에서 @XmlElement(name="item")을 제거 할 수 없습니까? (하지만 여전히 나는 모든 올바르게 이해한다면하지 않도록)

편집

귀하의 코멘트에 따르면

, 내가 제안 :

@XmlRootElement(name="list") 
public class JaxbBaseList<T> implements JaxbList<T>{ 
    protected List<T> list; 

    public List<T> getList(){ 
     return list; 
    } 
} 


public class JaxbPrimitiveList<T> extends JaxbList<T>{ 
    protected List<T> list; 

    @XmlElement(name="item") 
    public List<T> getList(){ 
     return list; 
    } 
} 

@XmlSeeAlso(Uri) 
public class JaxbUriList<Uri> extends JaxbList<Uri>{ 
    protected List<Uri> list; 

    @XmlElement(name="uri") 
    public List<Uri> getList(){ 
     return list; 
    } 
} 
+0

문제는이다의 JaxbBaseList 언어 유형에 사용되어야한다 long, Integer, String 등으로 정의하고 다른 구현은 다른 유형에 사용해야한다고 정의합니다. 그래서 JaxbUriList2는 그냥 쓸모없는 예제 일 뿐더러 String 대신 URI를 사용하는 것이 좋습니다. @XmlSeeAlso 어노테이션이 필요하다. 그래서 두 클래스가 그대로 필요합니다. @XmlSeeAlso 주석 (즉, "@XmlSeeAlso (URI.class) 공용 클래스 JaxbUriList extends JaxbBaseList "을 사용하는 언어 유형 및 기타 모든 구현을위한 JaxbBaseList. – gerry

+0

EDIT에 관해서. 좋아, 그거야. 그러나 JaxbPrimitiveList에서만 @XmlElement (name = "item")를 제외하고 JaxbBaseList 과 JaxbPrimitiveList 은 동일합니다. DRY 개념을 따르지 않습니다. 그래, 음, JaxbUriList가 아니라 중 하나; 그러나 내가 생각할 수있는 해결책이 없다. 내 질문에 "@XmlRootElement (name ="list ") 주석의 이름이 @XmlElement (name ="item ")가 아닌 @XmlElement가 대체되는 이유는 무엇입니까? 왜 목록이 두 번 추가됩니까? 'item'과 'uri'로 한 번? " – gerry

+0

나는 그것이 당신의 초기 질문에 대한 답이 아니라는 것을 알고 있습니다.나는 그저 반사 메커니즘인지 또는 결함이있는 JAXB인지 직접 판단하려했습니다. 귀하의 질문에 관해서 JAXB가 구현되는 방식이며, 따라서 대답은 "이것이 이와 같아서"와 같은 것일까 두려워합니다. 그러나 누군가 JAXB 구현의 이론적 근거 및/또는 불일치를 설명하는보다 설득력있는 답변을 제공 할 것입니다. – ewernli

관련 문제