【问题标题】:@ExceptionHandler doesn't handle the thrown exceptions@ExceptionHandler 不处理抛出的异常
【发布时间】:2011-02-21 18:17:00
【问题描述】:

我的控制器中有一个方法可以处理应用程序抛出的异常。所以我有一个像这样的方法。

@Controller
public class ExceptionController {

    @RequestMapping(value="/error")
    @ExceptionHandler(value={Exception.class, NullPointerException.class})
    public String showError(Exception e, Model model){
        return "tiles:error";
    }
}

如果它有效,我会在其他方法控制器的另一个方法中抛出 NullPointerException:

boolean a = true;
if(a){ 
    throw new NullPointerException();
}

抛出异常后,它会打印在 JSP 中,但它不会抛出我的 showError() 方法(我在那里设置了一个断点,它永远不会进入)。 showError() 方法将捕获异常并根据异常类型显示不同的错误页面(尽管现在它总是显示相同的错误页面)。如果我转到 url /error 它会显示错误页面,所以 showError() 方法就可以了。

我正在使用 Spring 3。

可能是什么问题?

谢谢。

【问题讨论】:

标签: java spring jsp exception-handling spring-mvc


【解决方案1】:

如果您查看日志,您可能会看到:

java.lang.IllegalStateException: 不支持的论点 [org.springframework.ui.Model] 为 @ExceptionHandler方法

换句话说,@ExceptionHandler 方法不允许声明Model 参数(请参阅docs)。

删除该参数(无论如何您都不会使用),它应该可以按预期工作。

【讨论】:

  • 谢谢,这是真的,但它并不能解决问题。我已经意识到只有在同一控制器内的方法抛出异常时才会捕获该异常。可能是因为这个bug:jira.springsource.org/browse/SPR-5959
  • @Javi:这不是错误,这是设计使然,并在文档中说明:static.springsource.org/spring/docs/3.0.x/…
  • 我查看了你上面链接的文档页面,但我一定很密集,我没有看到任何说你不能在方法中包含模型参数的东西,你能指出出去?
  • @chrismarx:该页面列出了可以作为方法参数获取的对象类型,以及可以从中返回的对象类型。 Model 属于后者,但不属于前者。
【解决方案2】:

如果你想在全局范围内(在你的控制器之外)处理异常,那么你可以使用一个 @ControllerAdvice 注释类,你可以在其中放置你的 @ExceptionHandler 注释方法。

请参阅http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc 以获取示例。 http://blog.codeleak.pl/2013/11/controlleradvice-improvements-in-spring.html 在春季 4 中进行的改进。

【讨论】:

    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2011-05-12
    • 2016-09-16
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多