特定注解方法的 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 自定义注解支持EL表达式(基于 MethodBasedEvaluationContext 实现)