2012-03-29 6 views
6

オブジェクトのジェネリックリストをマーシャリングしようとしていますが、各リストに特定のXmlRootElement(name ..)が必要です。私がやっているやり方は、オブジェクトの種類ごとに固有のラッパークラスを作成し、XmlRootElementを宣言しなければ、実際には可能ではないことです。しかし、別の方法があるかもしれません...?JAXB可変ルート要素名を持つジェネリックリストをマーシャリング

は、以下のクラスを検討:予想通り

abstract public class Entity { 

} 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name="user") 
public class User extends Entity { 

    private String username; 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

} 

@XmlRootElement 
public class EntityList<T extends Entity> { 

    @XmlAnyElement(lax=true) 
    private List<T> list = new ArrayList<T>(); 

    public void add(T entity) { 
     list.add(entity); 
    } 

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

} 


public class Test { 

    public static void main(String[] args) throws JAXBException { 

     User user1 = new User(); 
     user1.setUsername("user1"); 

     User user2 = new User(); 
     user2.setUsername("user2"); 

     EntityList<User> list = new EntityList<User>(); 
     list.add(user1); 
     list.add(user2); 

     JAXBContext jc = JAXBContext.newInstance(EntityList.class, User.class); 
     Marshaller m = jc.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
     m.marshal(list, System.out); 
    } 

} 

を、これは生産:私が欲しいもの

<entityList> 
    <user> 
     <username>user1</username> 
    </user> 
    <user> 
     <username>user2</username> 
    </user> 
</entityList> 

は、私が作成したエンティティの種類に応じて、そのタグ名を変更することができることですのEntityList

私はここでコンパイルとランタイムを話していることを知っていますが、おそらく子供から親要素のラッパーを変更するための何らかの種類のハックな方法がありますか?

答えて

3

JAXBElementにEntityListのインスタンスをラップすると、実行時にルート要素名を指定できます。その方向に私を指しているため

+0

おかげで、私はJAXBマーシャリングのためにSpringのMarshallingViewを使用していて...これは、簡略化した例です。しかし、実行時にJAXBElementをラッパーとして使用することができることを知った上で、私は自分自身のマーシャル・インプリメンテーションを春に書くことができ、実行時にある種のカスタム・アノテーションをイントロスペクトできます。ありがとう! – user1301841