我的环境
所以基本上我的应用程序应该返回一系列序列化公司。 公司类有一组延迟加载的旅行者对象(lazy =' true'在映射中定义)。因此,它们不应该被序列化。 但是,当杰克逊从控制器序列化公司时,出于某种原因,它还会尝试序列化旅行者,但它会崩溃并抛出错误: org.hibernate.LazyInitializationException - 懒得失败 初始化角色集合:com.model.core.Corporation.employees
我已经搜索了这个问题,我已经在几个帖子中看到了它,但到目前为止我还没有能够修复它。 https://github.com/FasterXML/jackson-datatype-hibernate/issues/25
我的代码基本上由java" Corporation"具有hbm.xml映射的类。 我还扩展了ObjectMapper并将其设置为Spring消息转换器,如中所述 该帖子(Avoid Jackson serialization on non fetched lazy objects) 然后我创建了一个" CorporationMixin" class并使用@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>
&#34;株式会社&#34;实体:
public class Corporation implements Serializable
{
private String id;
private Set<Employee> employees;
...(get/set)
}
Mapper添加到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);
}
}
CorporationMixin类:
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public abstract class CorporationMixin {
}
返回序列化公司的Controller类:
@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);
}
有一种解决方法可以避免hibernate崩溃,这基本上是在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的集合
感谢您的帮助!