参数不起作用的@ExceptionHandler

时间:2013-09-02 11:04:01

标签: spring-mvc exception-handling

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

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

但是如果我添加任何参数,那就不行了:

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

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

2 个答案:

答案 0 :(得分: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超类。

编辑: 如果第二个示例中的错误返回值。

答案 1 :(得分:0)

我通过在请求中传递自定义参数来解决问题。

代码如下:

<强>控制器

@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 question and its answer

完整源代码可在git

获取