我试图在Controller类中捕获某些类的所有异常。它工作正常 我这样定义:
@ExceptionHandler(NoSearchResultException.class)
public String handleNoSearchResultException() {
return "someView";
}
但是如果我添加任何参数,那就不行了:
@ExceptionHandler(NoSearchResultException.class)
public String handleNoSearchResultException(Exception e) {
return "someView";
}
可能会发生什么?另外,我读过@ExceptionHandler不支持Model参数,那么如何将参数(例如错误消息)传递给视图以提供动态错误页面?
答案 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
获取