前言
在webflux响应式编程中,如何处理系统运行时异常是本节的主要内容。在传统的Servlet阻塞式web项目中主要通过HandlerExceptionResolver处理器来处理,而在webflux响应式web项目中,则是通过DispatchExceptionHandler异常处理器来处理异常。由于大量的异常可能在运行过程中产生,针对业务方法单个处理显然不是最优的选项。
本节内容主要是针对一些运行时异常,实现全局异常处理,包括一些业务异常,通过自定义异常,将异常抛出到最上层,使用全局的异常处理器处理,返回统一的异常格式。主要是通过实现ErrorWebExceptionHandler的handle方法实现。
正文
①创建一个数学异常,查看webflux项目默认的异常处理
@Operation(summary = "获取全部用户信息", description = "获取全部用户信息")
@GetMapping(value = "getAllUserInfo")
public Mono<ApiResponse<List<User>>> getAllUserInfo() {System.out.println(1 / 0);Flux<User> userInfo = userService.getAllUserInfo();return userInfo.collectList().map(user -> ApiResponse.success(user));
}
②使用swagger工具调用接口,查看异常返回结果,默认异常响应结果说明不够清晰
③创建一个全局异常处理器GlobalErrorWebExceptionHandler,并返回统一格式的异常响应结果,便于统一处理
package com.yundi.atp.exception;import com.fasterxml.jackson.databind.ObjectMapper;
import com.yundi.atp.common.ApiResponse;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Slf4j
@Component
public class GlobalErrorWebExceptionHandler implements ErrorWebExceptionHandler {@SneakyThrows@Overridepublic Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {log.info("ex:" + ex);// 1.创建一个响应对象ServerHttpResponse response = exchange.getResponse();HttpHeaders headers = response.getHeaders();headers.setContentType(MediaType.APPLICATION_JSON);// 2.根据不同的异常类型返回不同的错误信息和HTTP状态码if (ex instanceof ArithmeticException) {//2.1数学计算异常ApiResponse apiResponse = ApiResponse.fail(101, "数学计算异常!");byte[] bytes = new ObjectMapper().writeValueAsBytes(apiResponse);DataBuffer buffer = response.bufferFactory().wrap(bytes);return response.writeWith(Mono.just(buffer));} else {//2.2其它兜底异常ApiResponse apiResponse = ApiResponse.fail(111, "系统异常!");byte[] bytes = new ObjectMapper().writeValueAsBytes(apiResponse);DataBuffer buffer = response.bufferFactory().wrap(bytes);return response.writeWith(Mono.just(buffer));}}
}
PS:这里需要注意的是全局异常处理器要使用@Component注解,将处理器加入到spring的IOC容器中才能生效
④使用swagger工具调用接口,查看异常返回结果,验证是否按照统一响应格式要求返回
⑤ 除了一些计算异常,数据验证异常等,我们还可以有一类自定义的业务异常,也可以通过全局异常处理器处理,这里创建一个自定义的异常类MyException,并实现其一些构造方法,方遍调用
package com.yundi.atp.exception;import lombok.Data;@Data
public class MyException extends RuntimeException {private Integer code;public MyException(String msg) {super(msg);}public MyException(Integer code, String msg) {super(msg);this.code = code;}
}
⑥ 在全局异常处理器GlobalErrorWebExceptionHandler中增加自定义的异常处理
⑦ 使用自定义异常返回异常
⑧使用swagger工具调用接口,查看异常返回结果,验证是否按照统一响应格式要求返回自定义异常处理
⑨ 也可以根据项目的实际情况,增加其它异常处理,例如数据验证不通过的异常处理
结语
关于springboot3下的webflux项目全局异常处理的内容到这里就结束了,我们下期见。。。。。。