Spring WebFlux全局异常拦截AbstractErrorWebExceptionHandler

Demon_Hao 2024-07-11 16:33:03 阅读 62

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

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

该类的主要职责包括:

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

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

代码实现:

<code>/**

* @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())));

}

}

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。