我的环境
- 杰克逊数据类型休眠 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的集合?
谢谢你的帮助!