我正在将一个运行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但它没有做任何事情。
答案 0 :(得分:3)
除了@Marijn的帖子之外,根据您的配置,有时异常No persistence exception translators found in container.
涵盖了真正的原因。附加到您的进程开始并捕获所有spring.net异常(Ctrl + Alt + E / CLR异常)通常会揭示根本原因。
例如,如果配置错误SessionFactory
,即使设置了正确的PersistenceExceptionTranslationPostProcessor
并将其注册到上下文中。
我通常会从我的DAO中删除Repository
属性(通过AOP添加异常转换并覆盖错误),以消除PersistenceExceptionTranslationPostProcessor
导致出现基础错误的需要。< / p>
此外,您可以发布web.config
和Persistence.xml
的相关部分。
答案 1 :(得分:1)
如果没有在容器中实现IPersistenceExceptionTranslator
的对象,则会出现此错误。如果你有一个Spring.Net + NHibernate应用程序,那么这通常是Spring.Net的LocalSessionFactoryObject
。 PersistenceExceptionTranslationPostProcessor
检查已注册的IPersistenceExceptionTranslator
实例的上下文。
您在NHibernate异常时没有收到此错误,但是在容器启动时。问题是Spring容器想要exception translation,但它在容器中找不到一个异常转换器。
如果您不使用Spring.net的LocalSessionFactoryObject
(无论出于何种原因),您应该在容器中注册自己的IPersistenceExceptionTranslator
。界面非常简单:
public interface IPersistenceExceptionTranslator
{
DataAccessException TranslateExceptionIfPossible(Exception ex);
}
您可以以LocalSessionFactoryObject
implementation of IPersistenceExceptionTranslator
为例。