4

良い一日を過ごしました。グーグリンとJSON1からJSON2へのアップグレードにかなりの時間を費やしましたが、エンティティのリストを返そうとすると、例外が発生します。

「受信した例外はJSONを書き込めませんでした:プロキシを初期化できませんでした-セッションがありません(参照チェーンを介して:」

これがHibernateの怠惰な初期化に関連していることは知っていますが、それを修正する方法がわかりません。jackson-module-hibernateプロジェクトが解決策だと思いました。しかし、私はそれを機能させることができませんでした。

これが私の技術です:

  • 春:3.2.1リリース
  • Hibernate4.1.7。ファイナル
  • ジャクソン2
  • ジャクソンコア2.0.4
  • jackson-databind:2.0.4
  • jackson-datatype-hibernate4:2.1.2

私はJavaConfigを使用しています:..。

@Bean
public com.mycompany.config.MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
    mappingJackson2HttpMessageConverter.setObjectMapper(new HibernateAwareObjectMapper());
    return mappingJackson2HttpMessageConverter;
}

@Bean 
public OpenEntityManagerInViewFilter springOpenEntityManagerInViewFilter() {
return new org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter();
}

@Bean
public ContentNegotiatingViewResolver contentNegotiatingViewResolver() {
final ContentNegotiatingViewResolver contentNegotiatingViewResolver = new ContentNegotiatingViewResolver();
contentNegotiatingViewResolver.setDefaultContentType(MediaType.APPLICATION_JSON);
final ArrayList defaultViews = new ArrayList();
defaultViews.add(converter());
contentNegotiatingViewResolver.setDefaultViews(defaultViews);
   return contentNegotiatingViewResolver;
}

私も持っています:

public class HibernateAwareObjectMapper extends ObjectMapper {

public HibernateAwareObjectMapper() {
    Hibernate4Module hm = new Hibernate4Module();
    registerModule(hm);
}
}

フローはコントローラーから始まります。コントローラーは、それぞれがエンティティまたはリストを返す複数のサービスを呼び出します。次に、返されたオブジェクトをオブジェクトに入れて、@ResponseBodyが機能すると考えて返します。ただし、例外が発生するため、正しく配線してはいけません。

誰かがここでエラーを見ることができますか?

ありがたいことに...

4

2 に答える 2

3

これは、jackson-datatype-hibernate の 2.5.0 バージョンで解決されています。次のように、Hibernate(3,4)Module で Hibernate SessionFactory を渡すだけです。

public class HibernateAwareObjectMapper extends ObjectMapper {

private static final long serialVersionUID = 1L;

@Autowired
private EntityManagerFactory emf;

@PostConstruct
public void init() {
    Hibernate4Module module = new Hibernate4Module(emf.unwrap(SessionFactory.class));

    module.enable(Hibernate4Module.Feature.FORCE_LAZY_LOADING);
    module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
}}

JPAが使用されている場合、上記のスニペットは問題ないため、EntityManagerFactory Beanが利用可能です。それ以外の場合は、Hibernate SessionFactory を注入してコンストラクターに渡します。

OpenSessionInView パターンを使用する必要はありません。

于 2015-02-05T10:14:57.577 に答える
0

シリアル化しようとしているオブジェクトに遅延ロードされたコンポーネントがあるため、OpenSessionInViewFilterをWeb構成に追加して、この問題を修正できます。

オブジェクトのロードに使用されるHibernateセッションは、実行がトランザクションに存在するときに閉じられるため、ビューレイヤー(jackson)がオブジェクトをシリアル化しようとして、遅延ロードされたオブジェクトをロードしようとすると、このエラーで失敗します。

これをweb.xmlに追加します

<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/app/*</url-pattern>
</filter-mapping>
于 2013-03-15T04:07:05.120 に答える