排除JAXB中的字段

时间:2012-06-10 12:05:09

标签: java xml jaxb java-ee-6

我有2个班级:

@XmlRootElement
public class A {

    private Long id;
    private B b;

    // setters and getters
}

@XmlRootElement
public class B {

    private Long id;
    private String field1;
    private String field2;

    // setters and getters
}

默认情况下,如果我将类A的实例转换为XML,我将拥有其所有字段(id)和引用的B类字段({{1} },idfield1)像这样:

field2

是否可以修改引用的类<a> <id>2</id> <b> <id>5</id> <field1>test1</field1> <field2>test3</field2> </b> </a> 中的哪些字段包含在B类的XML中?例如。我想说,当我转换A类的实例时,我只想从A类中获取id(没有Bfield1字段),所以我想得到:

field2

我不想永久注释<a> <id>2</id> <b> <id>5</id> </b> </a> 类(使用B@XMLTransient)来实现它,因为在某些情况下我想要导出整个{{1类似于{使用@XMLElementBid。)
field1引用field2类时,我只是不想导出所有这些字段。

这对JAX-B来说是否可行?

3 个答案:

答案 0 :(得分:99)

您可以使用注释@XmlTransient来忽略字段。将此注释放在字段本身或其getter上。

答案 1 :(得分:19)

默认的JAXB绑定可以在全局范围内或根据需要在使用custom binding declarations或在字段上使用@XmlTransient时根据需要进行覆盖。

从Baeldung网站Guide to JAXB查看此示例。

答案 2 :(得分:13)

好的,我已经提出了一些hacky解决方案:

@XmlRootElement
public class A {

    private Long id;
    private B b;

    // setters and getters
}

我为REST用例提供了一个额外的getter,所以它就像:

@XMLTransient
public B getB() {
    return b;
}

@XMLElement(name="b")
public Long getBForREST() {
    return b.getId();
}

它产生以下结构:

<a>
    <id>2</id>
    <b>5</b>
</a>

这与我的目标并不完全相同,因为它适用于我。

我不喜欢这个解决方案 - @XMLExclude({"field1", "field2"})或类似的东西在我看来会更清晰。

尽管如此 - 现在,它有效;它很难看,但它确实有效。