我有一个注释为@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
的课程。我遇到的问题是,当我不希望它们被绑定时,超类的方法被绑定,并且无法更新类。我希望有一个注释可以放在根元素类上以防止这种情况发生。
示例:
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Person extends NamedObject {
@XmlElement
public String getId() { ... }
}
我希望只有@XmlElement
上注释Person
的方法才会被绑定和编组,但超类的方法也都被绑定了。结果XML随后会有太多信息。
如何在不必注释超类本身的情况下阻止超类的方法被绑定?
答案 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的辅助访问器方法,并相应地调整代码。