Spring 异常处理:@Exception 处理程序未被调用

问题描述 投票:0回答:3

我最近正在使用 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:当我删除自定义异常的异常处理程序,只允许另一个时,它可以工作

java spring spring-mvc
3个回答
0
投票

显然您不能在 @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";   
}

0
投票

我无法发表评论,但 Xtian 的答案不再正确,因为文档显示 RedirectAttributes 是 @ExceptionHandler 支持的方法参数


-1
投票

尝试在你的 spring 配置中添加这一行:

<mvc:annotation-driven/> 

如果你不放它,你的类将不会被加载。

© www.soinside.com 2019 - 2024. All rights reserved.