特定注解方法的 Spring Boot 异常处理

Posted

技术标签:

【中文标题】特定注解方法的 Spring Boot 异常处理【英文标题】:Spring boot exception handling for specific annotated methods 【发布时间】:2016-11-10 03:28:06 【问题描述】:

我们的 Spring Boot 控制器具有由 ajax 调用的方法以及呈现 CRUD 模板的标准方法。我们希望能够用一个注解来注解我们所有的 ajax 方法,这样无论抛出什么类型的异常,我们都可以返回一个 ui 可以处理的响应。

我一直在研究 ControllerAdvice 和 ExceptionHandler 注释,但我认为它们都不能按照我们的意图使用。 ControllerAdvice 只能涵盖整个控制器,因此任何异常处理也将涵盖非 ajax 方法。同样,ExceptionHandler 注释将处理来自这两种方法的异常。

目前的想法是将ajax和CRUD这两种方法拆分为单独的控制器。有没有其他方法可以做到这一点?

【问题讨论】:

【参考方案1】:

我认为这在 Spring 中并不是那么容易/直接(或者至少就我目前的 Spring 知识而言)。

我们希望能够用一个单一的注解我们所有的 ajax 方法 注释

除了将 ajaxMethods 分离到另一个控制器中之外,我还能想到另一种方法。

1.声明你自己的异常类,比如myAjaxException

2.不要在控制器中处理这个异常,当你在你的ajax方法中遇到任何异常时抛出它。

  try
         //.... 
      catch(Exception ex)
          throw new myAjaxException("this is myAjaxException blah blah blah");
      

3.通过如下实现HandlerExceptionResolver来拦截myAjaxException。

在 DispatcherServlet 的应用程序中声明的任何 Spring bean 实现 HandlerExceptionResolver 的上下文将用于 拦截并处理任何异常在 MVC 系统中引发并且 由控制器处理。

public class AjaxExceptionResolver implements HandlerExceptionResolver 

   public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
  if (ex instanceof myAjaxException) 
              //return response to UI
    

  

【讨论】:

我也考虑过,但这意味着将每个 ajax 方法包装在一个 try/catch 块中,这是我们试图避免的 我知道,在我们找到更好的解决方案之前,我的解决方案可能是另一种“变通办法”。

以上是关于特定注解方法的 Spring Boot 异常处理的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot异常统一处理方法:@ControllerAdvice注解的使用全局异常捕获自定义异常捕获

Spring boot异常统一处理方法:@ControllerAdvice注解的使用全局异常捕获自定义异常捕获

Spring Boot全局异常处理器(原理及使用详解)

spring boot 全局异常处理

Spring Boot 自定义注解支持EL表达式(基于 MethodBasedEvaluationContext 实现)

Spring Boot2 系列教程 (十四) | 统一异常处理