2

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

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

在容器中找不到持久性异常翻译器。无法执行异常翻译。

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

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

假设它来自 NHibernate,并且如与 NHibernate 集成相关的 SpringFramework 文档中的第 44.3.3 节所述,我在映射中添加了一个 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>

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

4

2 回答 2

3

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

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

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

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

于 2012-06-06T10:00:15.127 回答
1

IPersistenceExceptionTranslator当您的容器中没有实现的对象时,您会收到此错误。当您有一个 Spring.Net+NHibernate 应用程序时,这通常是 Spring.Net 的LocalSessionFactoryObjectPersistenceExceptionTranslationPostProcessor检查已注册IPersistenceExceptionTranslator实例的上下文。

在 NHibernate 异常中不会出现此错误,但在容器启动时会出现此错误。问题是 Spring 容器想要进行异常翻译,但在容器中找不到单个异常翻译器。

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

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

你可以以LocalSessionFactoryObject实现IPersistenceExceptionTranslator为例。

于 2012-06-06T08:24:34.570 回答