2012-06-05 58 views
2

我将一个ASP.NET Webform应用程序与Spring.Net和NHibernate一起运行到ASP.NET MVC3。在创建一个新项目并验证Spring.Net可以在同一解决方案中的项目之间正确注入依赖项后,我继续导入新解决方案中的服务和持久层项目。Spring.Net(&NHibernate?),缺少异常转换器

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

No persistence exception translators found in container. Cannot perform exception translation.

[ConfigurationErrorsException: Error creating context 'spring.root': No persistence exception translators found in container. Cannot perform exception translation.]

如果我理解这口井,这意味着一个例外被提出,并且Spring.Net不知道如何映射/处理它......这是否正确?

假设从NHibernate的来了,在section 44.3.3 from the SpringFramework documentation有关NHibernate的整合解释,我添加了一个ExceptionTranslationProcessor到我的映射......

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

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

在此先感谢!


下面是参考用途的一些数据:

要我加入了spring section group和XML定义文件的引用的web.config文件:

<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,但它没有做任何事情。

回答

3

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

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

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

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

+2

非常感谢,这确实只是一个掩盖。真正的根本原因是NHibernate(Iesi.Collections)没有被复制到输出目录的依赖......因此Spring很难实现DAO层的实例... damn> _ < –

+0

+1啊,很好找。 – Marijn

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为例。