Spring WebFlux全局异常拦截AbstractErrorWebExceptionHandler

AbstractErrorWebExceptionHandler是Spring WebFlux框架中的一个类,用于处理Web应用程序中的全局错误。它是WebExceptionHandler接口的抽象实现,用于捕获和处理在Web请求处理过程中发生的异常。

在Spring WebFlux中,异常可能会在请求处理过程中产生,比如控制器方法中的异常、过滤器中的异常或者拦截器中的异常等。AbstractErrorWebExceptionHandler为这些异常提供了一个统一的处理入口,开发人员可以通过继承该类并实现其抽象方法来自定义异常处理逻辑。

该类的主要职责包括:

  1. 捕获异常:AbstractErrorWebExceptionHandler会捕获发生在Web请求处理过程中的异常。
  2. 处理异常:它提供了一个处理异常的方法,允许开发人员定义如何处理特定类型的异常。
  3. 生成错误响应:基于捕获到的异常信息,AbstractErrorWebExceptionHandler负责生成适当的错误响应,以便返回给客户端。

通过继承AbstractErrorWebExceptionHandler,开发人员可以灵活地实现自定义的异常处理逻辑,比如记录异常信息、返回特定格式的错误响应等,从而提高Web应用程序的稳定性和用户体验。

代码实现:

/**
 * @author Lucas
 * date 2024/3/6 19:11
 * description WebFlux异常拦截
 */
@Slf4j
@Component
@Order(-2)
public class GlobalErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler {

    public GlobalErrorWebExceptionHandler(ErrorAttributes errorAttributes,
                                          WebProperties properties,
                                          ApplicationContext applicationContext,
                                          ServerCodecConfigurer codecConfigurer) {
        super(errorAttributes, properties.getResources(), applicationContext);
        this.setMessageWriters(codecConfigurer.getWriters());
    }

    @Override
    protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {
        return RouterFunctions.route(RequestPredicates.all(), this::renderErrorResponse);
    }

    @SuppressWarnings("all")
    private Mono<ServerResponse> renderErrorResponse(ServerRequest request){
        Throwable error = getError(request);
        log.error("服务请求异常;",error);
        if (error instanceof WebExchangeBindException bindExc) {
            String msg;
            if (bindExc.hasErrors()){
                FieldError fieldError = bindExc.getFieldErrors().get(0);
                String field = fieldError.getField();
                String message = fieldError.getDefaultMessage();
                msg = "【"+field+"】校验失败!";
                if (message != null){
                    msg = msg + "msg: "+ message;
                }
            }else {
                msg = bindExc.getMessage();
            }
            return ServerResponse.status(HttpStatus.OK)
                    .contentType(MediaType.APPLICATION_JSON)
                    .bodyValue(R.fail(msg));
        } else if (error instanceof BusinessException exc) {
            return ServerResponse.status(HttpStatus.OK)
                    .contentType(MediaType.APPLICATION_JSON)
                    .bodyValue(R.fail(exc));
        } else if (error instanceof ResponseStatusException statusException){
            return ServerResponse.status(statusException.getStatus())
                    .contentType(MediaType.APPLICATION_JSON)
                    .body(BodyInserters.fromValue(statusException.getReason()));
        } else {
            return ServerResponse.status(HttpStatus.OK)
                    .contentType(MediaType.APPLICATION_JSON)
                    .bodyValue(R.fail(new BusinessException(error.getMessage())));
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值