【问题标题】:Excluding fields in JAXB排除 JAXB 中的字段
【发布时间】:2012-06-13 16:11:10
【问题描述】:

我有 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 类字段 (idfield1、@987654328 @) 像这样:

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

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

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

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

使用 JAX-B 是否也能做到这一点?

【问题讨论】:

    标签: java xml jaxb java-ee-6


    【解决方案1】:

    您可以在现场使用@XmlTransient。此外,可以使用custom binding declarations 在全局范围内或根据需要逐个覆盖默认 JAXB 绑定。

    查看 Baeldung 网站上的 Guide to JAXB 了解更多示例。

    【讨论】:

    • 谢谢!如果我使用 Glassfish JAXB 实现,我想这会使事情变得有点复杂......似乎没有基于注释的解决方案,我需要创建一个额外的自定义 XML?
    【解决方案2】:

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

    【讨论】:

    • 我应该把它放在哪里?在Bfield1field2 字段上?转换B 类的实例 时不会导致删除field1field2 吗?
    • 你应该把这些注解放在B类的字段或方法上。字段不会被删除。它们只是不会出现在生成的 XML 中
    • 谢谢亚历克斯,但我认为这正是我不想做的事情(请参阅我问题的最后一段)。此更改将禁止字段出现在 B 类的所有出现的结果 XML 中。
    【解决方案3】:

    好的,我想出了一些 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"}) 或类似的东西在我看来会更干净。

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

    【讨论】:

    • 您甚至可以将仅 REST 的 getter 设为私有,这样就不会混淆您班级的用户。
    猜你喜欢
    • 1970-01-01
    • 2012-06-10
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多