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>

PersistenceExceptionTranslationPostProcessorPersistence.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.configとの関連部分を投稿できますPersistence.xml

于 2012-06-06T10:00:15.127 に答える
1

IPersistenceExceptionTranslatorコンテナに実装するオブジェクトがない場合、このエラーが発生します。Spring.Net+NHibernate アプリケーションがある場合、これは通常、Spring.Net のLocalSessionFactoryObject. は、登録されたインスタンスPersistenceExceptionTranslationPostProcessorのコンテキストを検査します。IPersistenceExceptionTranslator

このエラーは、NHibernate 例外では発生しませんが、コンテナーの起動時に発生します。問題は、Spring コンテナーが例外変換を実行したいのですが、コンテナー内に単一の例外トランスレーターを見つけることができないことです。

LocalSessionFactoryObject(何らかの理由で) Spring.net を使用しない場合は、独自のものIPersistenceExceptionTranslatorをコンテナーに登録する必要があります。インターフェイスは非常にシンプルです。

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

LocalSessionFactoryObjectの実装をIPersistenceExceptionTranslator例として取り上げることができます。

于 2012-06-06T08:24:34.570 に答える