2012-03-29 5 views
6

그래서 개체의 일반 목록을 마샬링하려고하지만 각 목록에 특정 XmlRootElement (이름 ..)이 있어야합니다. 내가하는 방식으로, 각 유형의 개체에 대해 특정 래퍼 클래스를 작성하고 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의 인스턴스를 래핑하여 런타임시 루트 요소 이름을 제공 할 수 있습니다. 내가 JAXB 마샬링에 대한 Spring의 MarshallingView을 사용하고 같은

예 그 방향으로 날을 가리키는위한

+0

덕분에 ... 이것은 단순화 된 예입니다. 하지만 런타임에 JAXBElement를 래퍼로 사용할 수 있다는 것을 알고 봄 동안 내 자신의 마샬 러 구현을 작성하고 런타임에 일종의 사용자 정의 주석을 인트로 스에 넣을 수 있습니다. 감사! – user1301841

관련 문제