Spring.Net(& NHibernate?),缺少Exception Translators

时间:2012-06-05 15:48:56

标签: .net asp.net-mvc nhibernate spring.net

我正在将一个运行Spring.Net和NHibernate的ASP.NET Webform应用程序移植到ASP.NET MVC3。在创建一个新项目并验证Spring.Net可以在同一个解决方案中的项目之间正确地注入依赖项之后,我继续在新解决方案中导入服务和持久层项目。

我的映射现在看起来有点好(在这篇文章的末尾更多关于它)但是当我启动应用程序时,我收到以下错误:

  

在容器中找不到持久性异常转换器。不能   执行异常翻译。

     

[ConfigurationErrorsException:创建上下文'spring.root'时出错:   在容器中找不到持久性异常转换器。不能   执行异常翻译。]

如果我理解这一点,就意味着引发了一个异常并且Spring.Net不知道如何映射/处理它......这是正确的吗?

假设它来自NHibernate,并且如section 44.3.3 from the SpringFramework documentation中与NHibernate集成相关的解释,我在我的映射中添加了一个ExceptionTranslationProcessor ......

<object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data"/>

......但它似乎没有做任何事情,我不知道在哪里可以看得更远。任何人都有一个好主意或暗示?

提前致谢!


以下是一些供参考的数据:

在web.config文件中,我添加了spring section group以及对xml定义文件的引用:

<configuration>
    <!-- Snip -->
    <configSections>
        <sectionGroup name="spring">            
            <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc3"/>
            <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
            <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
        </sectionGroup>
    </configSections>
    <spring>
        <context>
            <resource uri="file://~/Config/controllers.xml"/>
            <resource uri="assembly://Service/Service.Config/Service.xml"/>
            <resource uri="assembly://Persistence.Hibernate/Persistence.Hibernate.Config/Persistence.xml"/>
        </context>
    </spring>
    <!-- Snip -->
</configuration>

我在Persistence.xml文件中添加了PersistenceExceptionTranslationPostProcessor。出于想法,我也尝试将其添加到其他xml但它没有做任何事情。

2 个答案:

答案 0 :(得分:3)

除了@Marijn的帖子之外,根据您的配置,有时异常No persistence exception translators found in container.涵盖了真正的原因。附加到您的进程开始并捕获所有spring.net异常(Ctrl + Alt + E / CLR异常)通常会揭示根本原因。

例如,如果配置错误SessionFactory,即使设置了正确的PersistenceExceptionTranslationPostProcessor并将其注册到上下文中。

我通常会从我的DAO中删除Repository属性(通过AOP添加异常转换并覆盖错误),以消除PersistenceExceptionTranslationPostProcessor导致出现基础错误的需要。< / p>

此外,您可以发布web.configPersistence.xml的相关部分。

答案 1 :(得分:1)

如果没有在容器中实现IPersistenceExceptionTranslator的对象,则会出现此错误。如果你有一个Spring.Net + NHibernate应用程序,那么这通常是Spring.Net的LocalSessionFactoryObjectPersistenceExceptionTranslationPostProcessor检查已注册的IPersistenceExceptionTranslator实例的上下文。

您在NHibernate异常时没有收到此错误,但是在容器启动时。问题是Spring容器想要exception translation,但它在容器中找不到一个异常转换器。

如果您不使用Spring.net的LocalSessionFactoryObject(无论出于何种原因),您应该在容器中注册自己的IPersistenceExceptionTranslator。界面非常简单:

public interface IPersistenceExceptionTranslator
{
    DataAccessException TranslateExceptionIfPossible(Exception ex);
}

您可以以LocalSessionFactoryObject implementation of IPersistenceExceptionTranslator为例。