我最近正在使用 hibernate、thymeleaf 和 spring security 开发 spring 应用程序。
我偶然发现了一种情况:我做了一个自定义例外:
@ResponseStatus(HttpStatus.BAD_REQUEST)
public class GlobalUrlParametersErrorsException extends RuntimeException {
private String errorMsgSignature;
private String errorMsgContent;
private String redirectionUrl;
public String getErrorMsgSignature() {
return errorMsgSignature;
}
public void setErrorMsgSignature(String errorMsgSignature) {
this.errorMsgSignature = errorMsgSignature;
}
public String getErrorMsgContent() {
return errorMsgContent;
}
public void setErrorMsgContent(String errorMsgContent) {
this.errorMsgContent = errorMsgContent;
}
public String getRedirectionUrl() {
return redirectionUrl;
}
public void setRedirectionUrl(String redirectionUrl) {
this.redirectionUrl = redirectionUrl;
}
public GlobalUrlParametersErrorsException(String errorMsgSignature, String errorMsgContent, String redirectionUrl){
this.errorMsgSignature = errorMsgSignature;
this.errorMsgContent = errorMsgContent;
this.redirectionUrl = redirectionUrl;
}
}
此异常是由我编写的其他一些自定义异常扩展的。
为了处理这些异常,我添加了一个
@ControllerAdvice
:
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
//some other exception like hibernate exception ...
@ExceptionHandler( value = GlobalUrlParametersErrorsException.class)//{InvalidDateException.class, InvalidRole.class, NoSuchUser.class, NoSuchNotification.class,NoSuchConsultation.class,NoSuchRdv.class})
public ModelAndView whenUrlDateParametersSuckMethod(RedirectAttributes redirectAttributes,GlobalUrlParametersErrorsException e){
redirectAttributes.addFlashAttribute(e.getErrorMsgSignature(),e.getErrorMsgContent());
return new ModelAndView("redirect:"+e.getRedirectionUrl());
}
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
ModelAndView m = new ModelAndView("errors/defaultError");
m.addObject("exception", e.toString());
m.addObject("url", req.getRequestURL());
return m;
}
}
但是我在控制器中抛出的异常仍然没有被捕获(我得到 glassfish 错误页面)
那么我的方法有什么问题吗?
PS:当我删除自定义异常的异常处理程序,只允许另一个时,它可以工作
显然您不能在 @ExceptionHandler 的方法参数中使用 RedirectAttributes:处理程序会被忽略。 目前文档说:
与使用@RequestMapping注解的标准控制器方法非常相似,@ExceptionHandler方法的方法参数和返回值可以是灵活的。例如,可以在Servlet环境中访问HttpServletRequest,在Portlet环境中访问PortletRequest。
看起来您可以使用 @RequestMapping 方法的相同参数,但它不适用于 RedirectAttributes。
解决方法是转发到@RequestMapping:
@ExceptionHandler(MyException.class)
public String handleMyException(MyException e) {
return "forward:/internalError";
}
@RequestMapping("/internalError")
public String internalError(RedirectAttributes redirectAttributes) {
// do stuff with redirectAttributes...
return "redirect:/someplace";
}
我无法发表评论,但 Xtian 的答案不再正确,因为文档显示 RedirectAttributes 是 @ExceptionHandler 支持的方法参数
尝试在你的 spring 配置中添加这一行:
<mvc:annotation-driven/>
如果你不放它,你的类将不会被加载。