1

我试图在我的 Controller 类中捕获某个类的所有异常。当我这样定义它时它工作正常:

@ExceptionHandler(NoSearchResultException.class)
    public String handleNoSearchResultException() {
        return "someView";
    }

但如果我添加任何参数,则不会:

@ExceptionHandler(NoSearchResultException.class)
    public String handleNoSearchResultException(Exception e) {
        return "someView";
    }

可能会发生什么?另外,我读过@ExceptionHandler 不支持模型参数,那么我如何将参数(例如错误消息)传递给视图以提供动态错误页面?

4

2 回答 2

3

要将参数传递给视图,我将创建一个自定义 Exception 类,您可以在其中存储任何所需的模型参数(例如错误消息)。然后在 @ExceptionHandler 方法中,您可以提取这些模型参数并使它们在视图中可用。例如:

class RequestException extends RuntimeException {
...
    public void setErrorMessages(List<String> errorMsgs) {
        this.errorMessages = errorMsgs
    }
...
}

@ExceptionHandler(RequestException.class)
public ModelAndView handleNoSearchResultException(RequestException ex) {
    ModelAndView mav = new ModelAndView("someView");
    mav.addObject("errors", ex.getErrorMessages());         //fetch error messages
    return mav;
}

至于参数,尝试将 NoSearchResultException 指定为方法参数,而不是它的 Exception 超类。

编辑:在第二个示例返回值中有一个错误。

于 2013-09-02T11:19:14.097 回答
1

我通过在请求本身中传递自定义参数解决了这个问题。

代码如下:

控制器

@RequestMapping(method = RequestMethod.GET, value = "/exception2")
public String getException1(ModelMap model, @CRequestParam("p") String p, HttpServletRequest request) {

  System.out.println("Exception 2 " + p);
  request.setAttribute("p", p);
  throw new CustomGenericException("1", "2");
}

异常处理程序

@ExceptionHandler(CustomGenericException.class)
public ModelAndView handleCustomException(CustomGenericException ex, HttpServletRequest request) {

  ModelAndView model2 = new ModelAndView("error/generic_error");
  model2.addObject("exception", ex);
  System.out.println(request.getAttribute("p"));
  System.out.println("CustomGenericException  ");
  return model2;

}

这是Sackoverflow 问题及其答案

完整的源代码可在git

于 2014-08-04T10:36:37.280 回答