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())));
        }
    }
}

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Gateway是一个基于Spring实现的微服务网关,它提供了一种灵活、强大的方式来构建、管理和路由微服务的请求流量。在使用Spring Cloud Gateway时,我们可以通过编写自定义的全局过滤器来实现全局拦截异常的功能。 要实现全局拦截异常,首先我们需要创建一个全局异常处理的类,该类需要继承自AbstractGatewayExceptionHandler。在这个类中,我们可以根据自己的需求重写相应的方法来处理异常。 比如,可以重写handleException方法来处理异常,并返回自定义的错误响应。在这个方法中,我们可以根据不同的异常类型进行不同的处理,比如返回特定的错误码、错误信息等。 然后,我们需要将这个全局异常处理类注册到Spring Cloud Gateway中。在Java配置文件中,添加一个Bean,将全局异常处理类的实例作为参数传入。 通过以上步骤,我们就可以实现Spring Cloud Gateway的全局拦截异常功能了。当微服务中出现异常时,系统会自动调用全局异常处理类中的相应方法来处理异常,并返回自定义的错误响应。 总之,使用Spring Cloud Gateway可以方便地实现全局拦截异常的功能。我们只需要编写一个自定义的全局异常处理类,并将其注册到Spring Cloud Gateway中即可。这样,我们就能够在微服务中统一处理各种异常,并返回自定义的错误信息。这样不仅提高了系统的可维护性,还可以提升用户的体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值