【问题标题】:Jackson only sees hibernate PersistentSet and not the actual SetJackson 只看到休眠的 PersistentSet 而不是实际的 Set
【发布时间】: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 会把这里的类型弄乱?而且只有杰克逊?

-- 莫腾

【问题讨论】:

    标签: hibernate jackson


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,我实际上已经使用配对 AnnotationIntrospector 启用了两者(首先是杰克逊,然后是 JAXB)。我不知道hibernate模块,我会研究一下。
    • 顺便说一句,我使用 JsonSerializer 解决了它,它会得到正确的对象,我只是使用 jgen 做一个自定义对象。我希望使用 jgen.writeObject( ... ) 但即使我向下转换为 IdentifiableObject 它仍然会编组旧值。
    • 好的,很高兴它有效。也总是可以针对休眠模块或杰克逊提出错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2020-05-19
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多