2012-06-05 94 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爲例。