1

EJB と Spring MVC を使用するアプリケーションで Hibernate Validator を使用しています。JBoss 5、Hibernate 3、および Spring MVC バージョン 3 を使用しています。

Spring Exception Resolver レベルで検証例外をキャッチして、メッセージに基づいてエラー メッセージを生成したいと考えていInvalidStateExceptionます。データ アクセス層に例外処理ロジックを配置したくありません。これを注釈によって駆動し、検証エラーを一元化された場所で処理するだけにしたいと考えています。

ドメイン モデルは正しく検証されておりInvalidStateException、無効なエンティティを作成しようとすると (フィールドの長さの制約に違反するなど)、期待どおりに型の例外がスローされます。Spring Exception リゾルバーのインスタンスで例外をキャッチしようとした時点で、元の例外が消えて代わりに ajavax.ejb.EJBTransactionRolledbackExceptionが使用されていることがわかりました。元の例外は原因リストにありません。

私の最初の推測では、のorg.hibernate.validator.InvalidStateExceptionアノテーションが付けられていなかったApplicationExceptionので、Hibernate イベント リスナーをインストールし、元の例外をキャッチして、 のアノテーションが付けられた新しい例外として再スローしましたApplicationException。これは効果がありません。

さらに複雑なのは、Web 層がリモート インターフェースを介して EJB を呼び出していることです。例外クラスに で注釈を付けましWebFaultたが、役に立ちませんでした。

例外が確実にバブルアップするようにするにはどうすればよいですか?

4

1 に答える 1

2

これを試して?

protected InvalidStateException extractValidationException(Throwable ex) { Throwable e = ex; while (e != null) { if (e instanceof InvalidStateException) { return (ValidationException) e; } else if (e instanceof EJBException) { e = ((EJBException) e).getCausedByException(); } else { e = e.getCause(); } } return null; }

于 2009-11-12T19:25:24.497 に答える