杰克逊只看到hibernate PersistentSet而不是实际的Set

时间:2011-11-21 13:17:29

标签: hibernate jackson

我有一组使用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

1 个答案:

答案 0 :(得分:1)

一些建议:首先,默认情况下,Jackson不使用JAXB注释,因此您可能需要启用支持(Jackson有自己的一组注释更好; JAXB支持针对遗留系统)。

但除此之外,还通过Jackson Hibernate module提供了对Hibernate类型的特定支持,因此您可能希望添加它。它可以处理惰性引用以及代理类型。

最后,Jackson对处理特定种类的循环依赖关系(与关系模型共同的父/子类型)有一些支持,请参阅this blog entry了解更多信息。