Jackson只看到hibernate PersistentSet,而不是实际的集合

Jackson只看到hibernate PersistentSet,而不是实际的集合,hibernate,jackson,Hibernate,Jackson,我有一组使用hibernate进行持久化的域类。这很好用。但现在我正试图在此基础上实现XML/JSON编组,我对Jackson和Set似乎有一些问题 所以我的代码基本上是这样的: @XmlRootElement class IdentifiableObject { @XmlAttribute Integer id; @XmlElement String name; } @XmlRootElement class A extends IdentifiableObject {}

我有一组使用hibernate进行持久化的域类。这很好用。但现在我正试图在此基础上实现XML/JSON编组,我对Jackson和Set似乎有一些问题

所以我的代码基本上是这样的:

@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;
}
因此,jackson marshaller似乎看到了hibernate代理,而不是实际的bean。。但是JAXB使用这种方法

我的webview使用的是过滤器org.springframework.orm.hibernate3.support.OpenSessionInViewFilter,它确保hibernate会话被打开(并重新使用)

有没有关于如何解决这个问题的建议

更新:所以事实上,如果我从集合中删除@XmlJavaAdapter,它在jackson端工作。。但是我需要重写我的对象,因为它实际上有一个循环引用。为什么@XmlJavaAdapter会把类型弄乱呢?只和杰克逊在一起

--
Morten有几个建议:首先,默认情况下Jackson不使用JAXB注释,因此您可能需要启用支持(Jackson有自己的注释集,可以更好地工作;JAXB支持针对遗留系统)

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


最后,Jackson对处理特定类型的循环依赖(关系模型中常见的父/子类型)有一些支持,请参阅以了解更多信息。

两条建议:首先,默认情况下Jackson不使用JAXB注释,因此您可能需要启用支持(Jackson有自己的注释集,可以更好地工作;JAXB支持针对遗留系统)

但除此之外,对Hibernate类型的特定支持是通过提供的,所以您可能想添加它。它可以处理惰性引用以及代理类型


最后,Jackson对处理特定类型的循环依赖(关系模型中常见的父/子类型)有一些支持,请参阅以了解更多信息。

是的,我实际上使用配对注释Introspector(Jackson先启用,然后是JAXB)启用了这两种依赖。我不知道hibernate模块,我会研究它。顺便说一句,我用JsonSerializer解决了它,它会得到正确的对象,我只是用jgen做了一个自定义对象。我希望使用jgen.writeObject(…)但是,即使我向下转换到IdentifiableObject,它仍然会封送旧值。好吧,很高兴它能工作。也可以针对hibernate模块或jackson属性提交错误,我实际上已经使用配对注释导入器启用了这两个功能(jackson先启用,然后是JAXB)。我不知道hibernate模块,我会研究它。顺便说一句,我用JsonSerializer解决了它,它会得到正确的对象,我只是用jgen做了一个自定义对象。我希望使用jgen.writeObject(…)但即使我向下转换到IdentifiableObject,它仍然会封送旧值。好吧,很高兴它能工作。也可以针对hibernate模块或jackson本身提交错误
Unable to marshal: org.hibernate.collection.PersistentSet cannot be cast to IdentifiableObject (through reference chain: B["aSet"])