バリデータの例外を休止
-
19-09-2019 - |
質問
私は、EJBとSpring MVCの持つアプリケーションでHibernateバリを使用しています。私は、JBoss 5は、Hibernate 3とSpring MVCのバージョン3を使用しています。
私は試してみて、キャッチ検証の例外を春例外リゾルバレベルとInvalidStateException
メッセージに基づいて、エラーメッセージを生成したいと思います。私は、データアクセス層に例外処理ロジックを置きたくありません。私は、これは、アノテーションによって駆動されるようにしたいとひとつの集中の場所で検証エラーを処理します。
ドメインモデルが正しく検証されていると私は(例えば、フィールド上の長さの制約に違反する)、無効なエンティティを作成しようとすると、期待通りのタイプのInvalidStateException
の例外がスローされます。春の例外リゾルバの私のインスタンスで例外をキャッチしようとしているの時点で、私は私の元の例外が消えてしまったとjavax.ejb.EJBTransactionRolledbackException
はその場所を取った見つけます。元の例外は、リストによって引き起こされるではありません。
私の最初の推測ではorg.hibernate.validator.InvalidStateException
がApplicationException
で注釈されていなかったということでしたので、私はHibernateのイベントリスナーをインストールし、元の例外をキャッチし、ApplicationException
で注釈を付け、新たな例外として、それをrethrew。これは効果がありません。
一つの更なる複雑さは、Web層は、リモートインタフェースを介してEJBを呼び出していることです。私はWebFault
ではなく、無駄に私の例外クラスを注釈付きます。
私は、例外がすべての方法をバブルアップを保証するために何をすべきか?
解決
これを試してみてください!
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;
}