47

我有 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类字段 ( id, field1, field2),如下所示:

<a>
    <id>2</id>
    <b>
        <id>5</id>
        <field1>test1</field1>
        <field2>test3</field2>
    </b>
</a>

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

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

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

这甚至可以用 JAX-B 实现吗?

4

3 回答 3

106

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

于 2012-06-10T12:09:16.190 回答
32

你可以@XmlTransient在球场上使用。此外,默认 JAXB 绑定可以在全局范围内或根据需要通过使用自定义绑定声明逐个进行覆盖。

查看Baeldung 网站上的JAXB 指南以获取更多示例。

于 2012-06-10T13:19:12.783 回答
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"})在我看来,一个或类似的东西会更干净。

尽管如此 - 现在,它可以工作;这很丑陋,但它有效。

于 2012-06-10T17:16:16.880 回答