10

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

例子:

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

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

}

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

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

4

6 回答 6

6

根据这个 StackOverflow 帖子: 如何忽略超类?

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

Update2:我在 java.net 上找到了 一个类似问题的线程。该线程产生了一个增强请求,该请求被标记为 另一个问题的副本,这导致了@XmlTransient 注释。对这些错误报告的评论让我相信这在当前规范中是不可能的。

于 2010-06-18T04:56:34.090 回答
5

只需添加

@XmlAccessorType(XmlAccessType.NONE)

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

在你的情况下:

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

请记住,这必须为每个超类真正完成,在处理巨大的类依赖树时经常被遗忘。

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

于 2009-03-22T01:40:22.357 回答
3

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

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

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

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

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

于 2011-01-19T10:01:37.477 回答
1

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

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

还有其他解决方案吗?

于 2009-04-02T16:50:31.420 回答
0

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

于 2012-01-27T14:12:08.190 回答
0

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

于 2019-06-20T09:35:39.080 回答