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

Java 如何防止JAXB在编组时绑定@XmlRootElement的超类方法?,java,xml,inheritance,annotations,jaxb,Java,Xml,Inheritance,Annotations,Jaxb,我有一个类被注释为@XmlRootElement,带有@xmlacessortype(xmlacesstype.NONE)。我遇到的问题是,当我不希望超类的方法被绑定时,超类的方法正在被绑定,并且无法更新该类。我希望有一个注释可以放在根元素类上,以防止这种情况发生 例如: @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) public class Person extends NamedObject { @XmlElement

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

例如:

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

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

}
我希望只有
Person
上注释的
@xmlement
方法会被绑定和封送,但超类的方法也都会被绑定。由此产生的XML包含的信息太多

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

只需添加

@XmlAccessorType(XmlAccessType.NONE)
在每个超类声明(以及类本身)前面

就你而言:

@XmlAccessorType(XmlAccessType.NONE)
class NamedObject{
    [ ... ]
}
记住,对于每个超类都必须这样做,通常是这样 在处理大型类依赖树时被遗忘


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

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

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


是否有其他解决方案?

根据此StackOverflow post:

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

更新2:我发现 对于类似的问题。那根线 结果,, 它被标记为 ,导致 @XmlTransient注释。评论 关于这些bug的报告让我 相信这在未来是不可能的 现行规范


我知道这个问题已经很老了,但是如果你的超类和它的子类在同一个包中,有一种解决方案是有效的

在包中创建一个
package info.java
,然后插入

@XmlAccessorType(XmlAccessType.NONE)
package my.package.with.classes;
显然,它会在包中的所有类上设置XmlAccessType.NONE。我自己,我在我们领域模型的每个包中都使用它。所以,我很安全。但是,如果您的类“遥不可及”,例如它在JDK中,请使用中接受的答案中的解决方案


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

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

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

我想避免进入超类,但我也得出了这个结论。谢谢你的回答。你发现了与此相关的任何内容吗?重写属性并向其添加
@xmltransive
注释。添加了引用SO问题的引用部分的链接。