【问题标题】:Spring.Net (& NHibernate?), missing Exception TranslatorsSpring.Net(& NHibernate?),缺少异常转换器
【发布时间】:2012-06-07 19:03:21
【问题描述】:

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

我的映射现在看起来还不错(在本文末尾有更多信息),但是当我启动应用程序时,我收到以下错误:

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

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

如果我理解得很好,这意味着引发了一个异常,并且 Spring.Net 不知道如何映射/处理它……对吗?

假设它来自 NHibernate,并且正如在与 NHibernate 集成相关的section 44.3.3 from the SpringFramework documentation 中解释的那样,我在我的映射中添加了一个 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,但它没有做任何事情。

【问题讨论】:

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


    【解决方案1】:

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

    例如配置错误的SessionFactory,即使正确的PersistenceExceptionTranslationPostProcessor 已设置并注册到上下文。

    我通常从我的 DAO 中删除 Repository 属性(它通过 AOP 添加异常转换并覆盖错误),以消除对 PersistenceExceptionTranslationPostProcessor 的需要,从而导致显示底层错误。

    另外你可以发布你的web.configPersistence.xml的相关部分。

    【讨论】:

    • 非常感谢,这确实只是一个掩饰。真正的根本原因是 NHibernate (Iesi.Collections) 的依赖没有被复制到输出目录......因此 Spring 很难实例化 DAO 层......该死的>_
    【解决方案2】:

    当您的容器中没有实现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 为例。

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2016-02-09
      • 2011-03-13
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2020-01-05
      • 2021-02-12
      相关资源
      最近更新 更多