springboot2 - 全局异常切面
@ControllerAdvice
常规的写法,就是使用 @ControllerAdvice,这个 spring 与 springboot 通用。
@ControllerAdvice 实际上是有参数的,可以指定的包名,对特定的代码生效。
/** * Controller异常切面 * * @author postm */ @ControllerAdvice(basePackages = "cn.seaboot.admin") public class ControllerExceptionHandler { private Logger logger = LoggerFactory.getLogger(ControllerExceptionHandler.class); /** * Handler ServiceException * * @param request - * @param response - * @param ex ServiceException * @return ModelAndView * @throws IOException If an input or output exception occurs * @see BindException */ @ExceptionHandler public ModelAndView exceptionHandler(HttpServletRequest request, HttpServletResponse response, ServiceException ex) throws IOException { loggerError(request, ex); if (CommonUtils.isAjax(request)) { return new Result(0, ex.getMessage()).toView(); } else { response.sendRedirect(request.getContextPath() + "/error/500.html"); return null; } } }
HandlerExceptionResolver
@ControllerAdvice 一般能满足大部分场景的使用,除此之外,你还也可以尝试使用HandlerExceptionResolver。
在一些不成熟的框架中,你有可能会遇到这种情况,访问后端的接口后,响应状态为400,然后返回一个错误页面(界面如下)。
这个问题主要是 DefaultHandlerExceptionResolver 引起的,在 springboot 中,HandlerExceptionResolver 默认的实现类是 DefaultHandlerExceptionResolver,如果我们并未处理代码中的异常,就会默认返回 400 页面,
对异常的处理,也可以通过重写其中的代码实现。我们不需要完整地实现 HandlerExceptionResolver,继承 DefaultHandlerExceptionResolver,重写我们需要的代码即可。
(下列代码是处理 hibernate-validator 时的代码,提供参考)
import cn.seaboot.admin.others.Jackson.Result; import org.springframework.lang.Nullable; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; public class ApplicationHandlerExceptionResolver extends DefaultHandlerExceptionResolver { /** * {{@link DefaultHandlerExceptionResolver#handleBindException}} * Override this method, a error json will send back to the client. * * @param request current HTTP request * @param response current HTTP response * @param handler the executed handler * @return an empty ModelAndView indicating the exception was handled * @throws IOException potentially thrown from {@link HttpServletResponse#sendError} * @author Mr.css */ @Override protected ModelAndView handleBindException(BindException ex, HttpServletRequest request, HttpServletResponse response, @Nullable Object handler) throws IOException { BindingResult result = ex.getBindingResult(); if (result.hasErrors()) { List<ObjectError> errors = result.getAllErrors(); Map<String, Object> object = new HashMap<>(errors.size()); for (ObjectError error : errors) { object.put(error.getObjectName(), error.getDefaultMessage()); } return new Result(3, object).toView(); } else { return Result.failed("数据验证中发生了未知的异常!").toView(); } } }
在SpringBoot中的注册方式如下
/** * 异常处理机制 * * @param resolvers - */ @Override public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { if (!resolvers.isEmpty()) { resolvers.removeIf(resolver -> resolver instanceof DefaultHandlerExceptionResolver); } resolvers.add(0, new ApplicationHandlerExceptionResolver()); }
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY