我有一组使用hibernate进行持久化的域类。这工作正常。但是现在我正在尝试在此基础上实现XML / JSON编组,并且我在Jackson和套装中遇到了一些问题。
所以我的代码基本上是这样的:
@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看到了hibernate代理,而不是真正的bean ..但是JAXB使用这个很好。
我的网页视图是使用所述过滤器org.springframework.orm.hibernate3.support.OpenSessionInViewFilter这使得确保hibernate会话被打开(和重复使用)。
有关如何解决此问题的任何建议吗?
更新:所以看起来如果我从集合中移除@XmlJavaAdapter,它在jackson方面工作..但我需要重写我的对象,因为它实际上有一个循环引用。为什么@XmlJavaAdapter会把这个类型搞乱?只有杰克逊?
- 的Morten
答案 0 :(得分:1)
一些建议:首先,默认情况下,Jackson不使用JAXB注释,因此您可能需要启用支持(Jackson有自己的一组注释更好; JAXB支持针对遗留系统)。
但除此之外,还通过Jackson Hibernate module提供了对Hibernate类型的特定支持,因此您可能希望添加它。它可以处理惰性引用以及代理类型。
最后,Jackson对处理特定种类的循环依赖关系(与关系模型共同的父/子类型)有一些支持,请参阅this blog entry了解更多信息。