4

我的环境

  • 杰克逊数据类型休眠 2.3.2
  • Spring-webmvc 3.2.6
  • 休眠 4.3.4

所以基本上我的应用程序应该返回一个序列化公司的列表。公司类有一组延迟加载的旅行者对象(映射中定义的延迟='true')。因此,它们不应该被序列化。然而,当杰克逊从控制器序列化公司时,由于某种原因,它也尝试序列化旅行者,但它崩溃并抛出错误: org.hibernate.LazyInitializationException - 未能延迟初始化角色集合:com.model。核心.公司.员工

我已经用谷歌搜索了这个问题,并且在几篇文章中看到了它,但到目前为止我还无法解决它。https://github.com/FasterXML/jackson-datatype-hibernate/issues/25

我的代码基本上由一个带有 hbm.xml 映射的 java“Corporation”类组成。我还扩展了 ObjectMapper 并将其设置为 Spring 消息转换器,如该帖子中所述(避免在未获取的惰性对象上进行 Jackson 序列化)然后我创建了一个“CorporationMixin”类并使用@JsonIdentityInfo 对其进行注释。最后,我只是从控制器返回公司列表。

请看一下我的代码并给我一个提示。我不知道问题是我的实现还是 jackson-datatype-hibernate 库中的错误。

映射 hbm :

<class name="com.model.core.Corporation" table="corporation" lazy="false">
 <id name="id" column="corporation_id" type="java.lang.String" unsaved-value="0">
    <generator class="guid"/>
  </id>
 <set lazy="true" name="employees" inverse="false" cascade="delete">
   <key column="corporation_id"/>
   <one-to-many class="com.model.core.Employee"/>
 </set>
...
</class>

“公司”实体:

public class Corporation implements Serializable
{
 private String id;
 private Set<Employee> employees;
...(get/set)
}

映射器添加到 servlet-context.xml:

<mvc:annotation-driven >
        <mvc:message-converters>
            <!-- Use the HibernateAware mapper instead of the default -->
            <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="com.mapper.HibernateAwareObjectMapper" />
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

HibernateAwareObjectMapper 类:

public class HibernateAwareObjectMapper extends ObjectMapper {

    public HibernateAwareObjectMapper() {
        registerModule(new Hibernate4Module());
        this.addMixInAnnotations(Corporation.class, CorporationMixin.class);
    }
}

公司混合类:

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public abstract class CorporationMixin {
}

返回序列化公司的控制器类:

@RequestMapping(value="/secured/corporations/init",method = RequestMethod.GET,produces = "application/json") 
    @ResponseBody 
    public ResponseEntity<List<Corporation>> getUsersList()
    {
        List<Corporation> corps = corporationDao.getTopCorporations();
        return new ResponseEntity<List<Corporation>>(corps, HttpStatus.OK);
    }

有一种解决方法可以避免休眠崩溃,基本上是在 web.xml 中添加它

<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
      <param-name>singleSession</param-name>
      <param-value>false</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

但这并不能真正解决最初的问题,这就是为什么杰克逊试图序列化lazy=true的集合?

谢谢你的帮助!

4

0 回答 0