그래서 개체의 일반 목록을 마샬링하려고하지만 각 목록에 특정 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.
여기에서 컴파일 시간과 컴파일 시간을 비교해 보겠다.하지만 어쩌면 아이와 부모 엘리먼트 래퍼를 바꾸는 해킹 방법이있을 수 있을까?
덕분에 ... 이것은 단순화 된 예입니다. 하지만 런타임에 JAXBElement를 래퍼로 사용할 수 있다는 것을 알고 봄 동안 내 자신의 마샬 러 구현을 작성하고 런타임에 일종의 사용자 정의 주석을 인트로 스에 넣을 수 있습니다. 감사! – user1301841