0

オーバーライドしようとしていますorg.apache.tapestry5.hibernate.HibernateSessionManager。これを行うために、これを AppModule に追加しました。

public static void contributeServiceOverride(
        MappedConfiguration<Class<?>, Object> configuration)
{
    configuration.addInstance(HibernateSessionManager.class,
            HibernateSessionManagerOverride.class);
}

内容はHibernateSessionManagerOverride(とりあえず)デフォルトのタペストリー実装と同じですorg.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl

アプリケーションを実行すると、次のエラーが発生します。

java.lang.RuntimeException: 
Exception constructing service 'ServletApplicationInitializer': 
Unable to instantiate class org.apache.tapestry5.services.TapestryModule as a module: 
Exception constructing service 'ServiceOverride': 
Error invoking service contribution method com.company.services.AppModule.contributeServiceOverride(MappedConfiguration): 
Exception constructing service 'ServiceOverride': 
Construction of service 'ServiceOverride' has failed due to recursion:
the service depends on itself in some way. Please check org.apache.tapestry5.ioc.internal.services.ServiceOverrideImpl(Map) (at ServiceOverrideImpl.java:31) via org.apache.tapestry5.ioc.services.TapestryIOCModule.bind(ServiceBinder) (at TapestryIOCModule.java:49) for references to another service that is itself dependent on service 'ServiceOverride'.
4

2 に答える 2

0

Lance の回答の価値を下げたくありませんが、このメソッドを使用すると、ThreadCleanupListener が追加または呼び出されていないことがわかりました。これは、スレッドのライフサイクルの最後にセッションがロールバックされていないことを意味します。上記の例を変更して、オーバーライドを threadcleanup リスナーとして追加しました。

public static HibernateSessionManager decorateHibernateSessionManager(
        HibernateSessionManager defaultManager,
        @Autobuild HibernateSessionManagerOverride overrideManager,
        PerthreadManager perthreadManager)
{
    perthreadManager.addThreadCleanupListener(overrideManager);
    return overrideManager;
}

これは、使用後にセッションがロールバックされて閉じられるようにするために重要です。

于 2014-07-15T22:29:14.637 に答える