首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tapestry覆盖HibernateSessionManager错误

Tapestry覆盖HibernateSessionManager错误
EN

Stack Overflow用户
提问于 2013-09-12 20:33:11
回答 2查看 448关注 0票数 0

我正在试图覆盖org.apache.tapestry5.hibernate.HibernateSessionManager。为此,我将以下内容添加到我的AppModule中:

代码语言:javascript
复制
public static void contributeServiceOverride(
        MappedConfiguration<Class<?>, Object> configuration)
{
    configuration.addInstance(HibernateSessionManager.class,
            HibernateSessionManagerOverride.class);
}

HibernateSessionManagerOverride的内容(暂时)与默认的Tapestry实现org.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl相同。

当我运行我的应用程序时,我会得到以下错误:

代码语言:javascript
复制
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'.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-13 09:57:08

查看hibernateModule.java,我可以看到以下内容:

代码语言:javascript
复制
@Contribute(ServiceOverride.class)
public static void provideInjectableSessionObject(
        MappedConfiguration<Class, Object> configuration, 
        @HibernateCore Session session)
{
    configuration.add(Session.class, session);
}

也许这是导致循环依赖的原因?

您可能需要使用装潢工而不是ServiceOverride

例:

代码语言:javascript
复制
public static HibernateSessionManager decorateHibernateSessionManager(
        HibernateSessionManager defaultManager, 
        @Autobuild HibernateSessionManagerOverride overrideManager)
{
    return overrideManager;
}
票数 1
EN

Stack Overflow用户

发布于 2014-07-15 22:29:14

我不想贬低兰斯的答案,但使用这种方法,我发现没有添加或调用ThreadCleanupListener,这意味着会话不会在线程生命周期结束时回滚。我修改了上面的示例,将重写添加为线程清理监听器。

代码语言:javascript
复制
public static HibernateSessionManager decorateHibernateSessionManager(
        HibernateSessionManager defaultManager,
        @Autobuild HibernateSessionManagerOverride overrideManager,
        PerthreadManager perthreadManager)
{
    perthreadManager.addThreadCleanupListener(overrideManager);
    return overrideManager;
}

这一点至关重要,以便会话在使用后回滚并关闭。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18773845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档