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());
    }
复制代码

 

posted on   疯狂的妞妞  阅读(452)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示