【问题标题】:JAXB Marshalling generic list with variable root element name具有可变根元素名称的 JAXB 编组通用列表
【发布时间】:2012-03-29 21:01:36
【问题描述】:

所以我试图编组一个通用的对象列表,但我希望每个列表都有一个特定的 XmlRootElement(name..)。我这样做的方式是,我知道如果不为每种类型的对象编写特定的包装类并声明 XmlRootElement,这是不可能的。但也许还有其他方法...?

考虑以下类:

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 的实体类型。

我知道我们在这里谈论的是编译与运行时,但也许有某种骇人听闻的方法来更改子元素的父元素包装器?

【问题讨论】:

    标签: java arraylist jaxb marshalling


    【解决方案1】:

    您可以将 EntityList 的实例包装在 JAXBElement 中,以便在运行时提供根元素名称。

    例子

    【讨论】:

    • 感谢您向我指出那个方向...这是一个简化的示例,因为我正在使用 Spring 的 MarshallingView 进行 JAXB 编组。但是知道我可以在运行时使用 JAXBElement 作为包装器,我可以为 spring 编写自己的编组器实现,并在运行时内省某种自定义注释。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多