私は、Web レイヤーに Struts2 を、ビジネス レイヤーに Spring を含むアプリケーションを使用しています。また、ビジネス関連の検証エラーを作成するためにすべてのビジネス サービスで使用される BusinessException クラスもあります。これは、Web レイヤーに到達する必要があり、検証メッセージとしてユーザーに表示する必要があります。これは、Action クラスに次のように記述することで簡単に実行できます。
ClientAction extends ActionSupport throws Exception{
....
try{
clientService.searchClient();
}catch(InvalidClientSearchCriteriaException e){
addActionMessage("Invlid Search Criteria");
}
...
そして、すべてのアクション クラスに同様のコードがあります。ただし、アクション クラスを try catch ブロックで汚染したくありません。代わりに、try catch ブロックを 1 か所に記述し、そこですべての例外を BusinessExceptions としてキャッチし、それらの例外に埋め込まれたメッセージ/エラーからメッセージ/エラーを作成できれば、はるかに優れています。私が考えることができる 1 つのアプローチは、インターセプターまたは事前結果リスナーを使用することでした。しかし、アクションクラスからスローされたBusinessExceptionsをキャッチする以下のようなインターセプターを使用することはできません...
ExceptionInterceptor extends AbstractInterceptor(ActionInvocation ivocation,...){
try{
invocation.invoke();
}catch(Exception e){
if(e instanceof BusinessException){
ActionSupport as = (ActionSupport)invocation.getAction();
String message = extractMessagefromException()//--custom method to extract message embedded in exception.
as.addActionMessages(message);
//-- above will not work result has already been rendered right? and hence it wouldn't matter if i add action messages now.
}
}
}
事前結果リスナーを使用する 2 番目のアプローチは、結果がまだレンダリングされておらず、安全に変更できるため、事前結果リスナーのメソッドに上記のようにアクション メッセージを追加することです。ただし、アクションで例外がスローされた場合、事前結果リスナーが実行されるかどうかはわかりませんか? たとえそうであっても、アクションによってスローされた例外オブジェクトを取得するにはどうすればよいですか?
クラスをtry-catchブロックで乱雑にする必要がない他のアプローチを教えてください