【发布时间】:2011-11-21 13:17:28
【问题描述】:
我有一组使用休眠进行持久性的域类。这工作正常。但现在我正在尝试在此基础上实现 XML/JSON 编组,我似乎对 Jackson 和 Sets 有一些问题。
所以我的代码基本上是这样的:
@XmlRootElement
class IdentifiableObject {
@XmlAttribute
Integer id;
@XmlElement
String name;
}
@XmlRootElement
class A extends IdentifiableObject {}
@XmlRootElement
class B extends IdentifiableObject {
@XmlElementWrapper(name = "aSet")
@XmlJavaAdapter( IdentifiableXmlAdapter.class )
@XmlElement( name = "a" )
Set<A> As;
}
这在 JAXB(我也在使用)中运行良好,但尝试使用 Jackson(使用 JaxbAnnotationIntrospector)编组它我得到了这个异常:
Unable to marshal: org.hibernate.collection.PersistentSet cannot be cast to IdentifiableObject (through reference chain: B["aSet"])
因此,jackson marshaller 似乎看到的是休眠代理,而不是实际的 bean。但是 JAXB 使用它很好。
我的 webview 正在使用过滤器 org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 确保打开(并重用)休眠会话。
关于如何解决此问题的任何建议?
更新:所以实际上,如果我从集合中删除 @XmlJavaAdapter,它可以在杰克逊方面工作。但我需要重写我的对象,因为它实际上有一个循环引用。为什么@XmlJavaAdapter 会把这里的类型弄乱?而且只有杰克逊?
-- 莫腾
【问题讨论】: