排除JAXB中的字段

Pio*_*cki 38 java xml jaxb java-ee-6

我有2个班:

@XmlRootElement
public class A {

    private Long id;
    private B b;

    // setters and getters
}
Run Code Online (Sandbox Code Playgroud)

@XmlRootElement
public class B {

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

    // setters and getters
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,如果我改变类的实例A到XML,我将所有的字段(id)和引用B类字段(id,field1,field2)是这样的:

<a>
    <id>2</id>
    <b>
        <id>5</id>
        <field1>test1</field1>
        <field2>test3</field2>
    </b>
</a>
Run Code Online (Sandbox Code Playgroud)

是否可以修改引用类中的哪些字段B包含在类的XML中A?例如,我想说当我转换一个A类的实例时,我只想idB类(no field1field2fields)中获取,所以我想得到:

<a>
    <id>2</id>
    <b>
        <id>5</id>
    </b>
</a>
Run Code Online (Sandbox Code Playgroud)

我不想永久注释B类(使用@XMLTransient@XMLElement)来实现它,因为在某些情况下我想按B原样导出整个类(with id,field1field2.)
我只是不想导出所有这些字段时在B类是从引用A.

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

Ale*_*exR 103

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


Edu*_*Ros 21

默认的JAXB绑定可以在全局范围内或根据需要在使用自定义绑定声明@XmlTransient在字段上使用时根据需要进行覆盖.

从Baeldung网站,JAXB指南中查看此示例.


Pio*_*cki 13

好的,我想出了一些hacky解决方案:

@XmlRootElement
public class A {

    private Long id;
    private B b;

    // setters and getters
}
Run Code Online (Sandbox Code Playgroud)

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

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

@XMLElement(name="b")
public Long getBForREST() {
    return b.getId();
}
Run Code Online (Sandbox Code Playgroud)

它产生以下结构:

<a>
    <id>2</id>
    <b>5</b>
</a>
Run Code Online (Sandbox Code Playgroud)

它与我的目标并不完全相同,因为它对我有用.

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

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

  • 您甚至可以将仅限REST的getter设为私有,因此不会混淆您班级的用户. (3认同)