私の環境
- ジャクソン-データ型-休止状態 2.3.2
- Spring-webmvc 3.2.6
- 休止状態 4.3.4
したがって、基本的に私のアプリケーションは、シリアル化された企業のリストを返すことになっています。コーポレーション クラスには、遅延読み込み (マッピングで定義された lazy='true') である一連の旅行者オブジェクトがあります。したがって、それらはシリアライズされるべきではありません。ただし、jackson がコントローラーから企業をシリアル化するとき、何らかの理由で、Traveller もシリアル化しようとしますが、クラッシュして次のエラーをスローします: org.hibernate.LazyInitializationException - failed to lazily initialize a collection of role: com.model. core.Corporation.employees
この問題をグーグルで検索し、いくつかの投稿で見ましたが、今のところ修正できていません。https://github.com/FasterXML/jackson-datatype-hibernate/issues/25
私のコードは基本的に、hbm.xml マッピングを持つ Java "Corporation" クラスで構成されています。また、ObjectMapper を拡張し、その投稿で説明されているように、それを Spring メッセージ コンバーターに設定しました (フェッチされていない遅延オブジェクトでのジャクソンのシリアル化を回避します)。次に、「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);
}
}
CorporationMixin クラス:
@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>
しかし、それで最初の問題が実際に解決されるわけではありません。
ご協力いただきありがとうございます!