2012-03-29 12 views
6

Bu yüzden, genel bir nesne listesi marshal'ı çalıştırmaya çalışıyorum, ancak her listenin belirli bir XmlRootElement öğesine sahip olmasını istiyorum (name ..). Yaptığım şekilde, her bir nesne türü için belirli bir sarmalayıcı sınıfı yazmadan ve XmlRootElement öğesini bildirmeden gerçekten mümkün olmadığını biliyorum. Ama belki başka bir yolu var ...JAXB Değişken kök öğesi adına sahip genel liste listesi

Beklendiği gibi
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); 
    } 

} 

, bu üretir:

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

İstediğim i oluşturmak Varlık türüne bağlı olarak, bu etiket adını değiştirmek için muktedir olduğunu

aşağıdaki sınıfları düşünün EntityList ile.

Burada derleme ve çalışma zamanı hakkında konuştuğumuzu biliyorum, ama belki de ana öğe sarıcısını çocuktan değiştirmek için bir çeşit yol var mı?

cevap

3

Çalışma zamanında bir kök öğe adı sağlamak için EntityList örneğini bir JAXBElement içine sarabilirsiniz. JAXB sıralanırken için Spring'in MarshallingView kullanıyorum olarak

Örnek bu yönde beni işaret için

+0

Teşekkür ... Bu, basitleştirilmiş bir örnektir. Fakat JAXBElement'i çalışma zamanında bir sarıcı olarak kullanabileceğimi bildiğim için, bahar için kendi mareşal uygulamamı yazabilirim ve çalışma zamanında bir tür özel açıklama ekleyebilirim. Teşekkürler! – user1301841