如何只在一个地方处理struts 2中服务层的业务异常

时间:2013-10-25 07:22:15

标签: spring exception-handling struts2

我正在处理一个涉及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块并在那里捕获所有异常作为BusinessExceptions并在这些异常中从嵌入消息/错误中创建消息/错误,那将会好得多。           我能想到的一种方法是使用拦截器或preresult监听器。 但我不能使用下面的拦截器来捕获从动作类抛出的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.
           }
         }                                               
   } 

使用pre-result listener的第二种方法是在pre-result listener的方法中添加与上面类似的动作消息,因为结果尚未呈现,我可以安全地更改它。但是,如果异常被抛出,我不确定预结果监听器是否会执行?即使它确实如此,我如何才能获得动作抛出的异常对象?

请告诉我任何其他方法,我不需要使用try-catch块来混乱我的课程

0 个答案:

没有答案