適切なEJB例外処理-クライアントからのClassNotFoundException
質問
Hibernateを使用してデータベースにデータを永続化するEJBがいくつかあります。これらのEJBと通信する分厚いSwingクライアントがあります。クライアントはデータベースについて何も知りません(ドライバーjarを知りません)。
1つのトランザクション中にHibernate ConstraintViolationExceptionがスローされる場合があります。すべての例外をキャッチし、EJBExceptionで次のようにラップします。
catch(HibernateException e) {
e.printStackTrace();
throw new EJBException(e);
}
私が得ている問題は、クライアント側のJBoss Invokerによって例外が非整列化されると、クライアントがクラスパスにsqlドライバーjarを持たないためClassNotFoundExceptionがスローされることです(PSQLExceptionの場合)。
このアプリケーションを変更して、キャッチされた例外を常にこのようなejbexceptionコンストラクターに渡すようにしたため、スタックトレースの履歴を取得できます。今、私は元の開発者がこれをしなかった理由を見つけています。
この時点で、クライアントにpostgresドライバーjarを含めるか、キャッチした例外をEJBExceptionコンストラクターに渡すかを削除する2つのオプションが表示されます。誰か他の提案があり、他の人がEJBの例外をどのように処理するのか興味がありますか?
解決
私の見解では、クライアントであるエンドユーザーは、問題の技術的な詳細を知る必要はありません。したがって、さまざまなレイヤーの境界では、技術的な例外を一般的な「自然のエラーXYZが発生しました」に変換することは非常に合理的です。
私が使用したスキームは、例外が検出された時点でサーバーが一意のエラー番号を割り当てることです。次に、その番号を含む診断をログに書き込みます。クライアントに報告されるメッセージには、単に番号が含まれています。サポートデスクは、その特定のエラー番号を介して問題のユーザーのレポートを関連付けることができます。