编组时如何防止JAXB绑定@XmlRootElement的超类方法?

时间:2009-03-18 20:01:04

标签: java xml inheritance annotations jaxb

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

示例:

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

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

}

我希望只有@XmlElement上注释Person的方法才会被绑定和编组,但超类的方法也都被绑定了。结果XML随后会有太多信息。

如何在不必注释超类本身的情况下阻止超类的方法被绑定?

6 个答案:

答案 0 :(得分:6)

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

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

  

Update2:我找到了a thread on java.net   对于类似的问题。那个帖子   结果是enhancement request,   被标记为重复的   another issue,这导致了   @XmlTransient注释。评论   在这些错误报告引导我   相信这是不可能的   当前规范。

答案 1 :(得分:5)

添加

@XmlAccessorType(XmlAccessType.NONE)

在EACH超类声明(以及类本身)前面。

在你的情况下:

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

请记住,必须经常为每个超类做这件事 在处理巨大的类依赖树时忘记了。

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

答案 2 :(得分: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?中接受的答案中的解决方案。

我希望这对任何偶然发现这个问题的人都有帮助。

答案 3 :(得分:1)

我面临同样的问题。 我的超类不处理任何JAXB注释(它没有),我希望我的子类在编组时不要包含超类属性。

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

还有其他解决方案吗?

答案 4 :(得分:0)

MOXy替换您的JAX-B实现,您可以执行任何操作。它有大量的扩展,超出普通的JAX-B,其中一个允许你忽略继承的属性等。它还支持将JAX-B注释移动到XML映射文件,这样你就可以保留多组映射

答案 5 :(得分:0)

我发现了一个解决方案,但是它可能对您不起作用,具体取决于您要执行的操作,它是重写要忽略的吸气剂,并让它们返回>>> cases = [(0, 0), (0, 1), (1, 0), (1, 1)] >>> [a == 0 & b == 0 for a, b in cases] # should be [True, False, False, False] [True, True, False, False] # but evaluates as "a == 0 == 0" >>> [a == 0 & b == 1 for a, b in cases] # should be [False, True, False, False] [False, False, False, False] # but evaluates as "a == 0 == 1" >>> [a == 1 & b == 0 for a, b in cases] # should be [False, False, True, False] [True, False, False, False] # but evaluates as "a == b == 0" >>> [a == 1 & b == 1 for a, b in cases] # should be [False, False, False, True] [False, False, False, True] # evaluates as "a == b == 1" ("correct") 。 JAXB规范(通过扩展实现)将忽略包含空值的字段。请注意,如果仍然需要能够使用子类访问超类值本身,则可能需要添加不是getter的辅助访问器方法,并相应地调整代码。