【问题标题】:How do I prevent JAXB from binding superclass methods of the @XmlRootElement when marshalling?编组时如何防止 JAXB 绑定 @XmlRootElement 的超类方法?
【发布时间】:2009-03-18 20:01:04
【问题描述】:

我有一个类被注释为@XmlRootElement@XmlAccessorType(XmlAccessType.NONE)。我遇到的问题是超类的方法正在被绑定,当我不希望它们被绑定并且无法更新类时。我希望有一个注释可以放在根元素类上以防止这种情况发生。

例子:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Person extends NamedObject {

    @XmlElement
    public String getId() { ... }

}

我希望只有 Person 上注释 @XmlElement 的方法会被绑定和编组,但超类的方法也都被绑定了。生成的 XML 则包含太多信息。

如何防止超类的方法被绑定而不必注释超类本身?

【问题讨论】:

    标签: java xml inheritance annotations jaxb


    【解决方案1】:

    根据这个 StackOverflow 帖子: How can I ignore a superclass?

    JAX-B 不可能在不修改超类的情况下忽略超类。 引用该帖子的相关部分:

    Update2:我找到了a thread on java.net 对于类似的问题。那条线 导致enhancement request, 被标记为重复 another issue,导致 @XmlTransient 注释。厘米 在这些错误报告中,我引导到 相信这是不可能的 当前规格。

    【讨论】:

    • 从引用的 SO 问题的引用部分添加了链接。
    【解决方案2】:

    只需添加

    @XmlAccessorType(XmlAccessType.NONE)
    

    在每个超类声明(以及类本身)之前。

    在你的情况下:

    @XmlAccessorType(XmlAccessType.NONE)
    class NamedObject{
        [ ... ]
    }
    

    请记住,这必须对每个超类都进行,通常是 在处理巨大的类依赖树时忘记了。

    当然,接口不需要任何 JAXB 注释。

    【讨论】:

    • 我想避免进入超类,但我也得出了这个结论。感谢您的回答。
    【解决方案3】:

    我知道这个问题已经很老了,但是如果你的超类与其子类在同一个包中,那么有一种解决方案可以工作。

    在你的包中创建一个package-info.java 并插入

    @XmlAccessorType(XmlAccessType.NONE)
    package my.package.with.classes;
    

    显然,它在包中的所有类上设置 XmlAccessType.NONE。我自己,我在我们的域模型的每个包中都使用它。因此,我很安全。但是,如果您的课程“遥不可及”,则 f.e.它在 JDK 中,使用[JAX-B] How can I ignore a superclass? 中接受的答案中的解决方案。

    我希望它对像我一样偶然发现这个问题的人有所帮助。

    【讨论】:

      【解决方案4】:

      我面临着完全相同的问题。 我的超类不处理任何 JAXB 注释(它不是必须的),我希望我的子类在编组时不要包含超类属性。

      在超类上添加 XmlAccesorType 不是解决方案,因为我无法修改超类。

      还有其他解决办法吗?

      【讨论】:

      • 你有什么发现吗?
      • 覆盖该属性并为其添加@XMLTransient注解。
      【解决方案5】:

      MOXy 替换你的JAX-B 实现,你可以做任何你想做的事情。它有大量超越普通 JAX-B 的扩展,其中一个允许您忽略继承的属性等。它还支持将 JAX-B 注释移动到 XML 映射文件,因此您可以保留多组映射.

      【讨论】:

        【解决方案6】:

        我找到了一个解决方案,但可能对您不起作用,具体取决于您想要做什么,即覆盖您想要忽略的 getter 并让它们返回 null。 JAXB 规范以及扩展的实现忽略了包含空值的字段。请注意,如果您仍然需要能够使用子类访问超类值本身,您可能需要添加一个不是 getter 的辅助访问器方法并相应地调整您的代码。

        【讨论】:

          猜你喜欢
          • 2013-11-05
          • 1970-01-01
          • 1970-01-01
          • 2015-09-01
          • 1970-01-01
          • 2016-06-20
          • 2016-08-10
          • 2018-03-03
          • 2012-11-14
          相关资源
          最近更新 更多