使用RouterFunction的方式,全局处理异常
@Configuration
@Order(-2)
public class GlobalErrorHandler implements ErrorWebExceptionHandler {
private ObjectMapper objectMapper;
public GlobalErrorHandler(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
@Override
public Mono<Void> handle(ServerWebExchange serverWebExchange, Throwable throwable) {
DataBufferFactory bufferFactory = serverWebExchange.getResponse().bufferFactory();
if (throwable instanceof IOException) {
serverWebExchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
DataBuffer dataBuffer = null;
try {
dataBuffer = bufferFactory.wrap(objectMapper.writeValueAsBytes(new HttpError("Custom message")));
} catch (JsonProcessingException e) {
dataBuffer = bufferFactory.wrap("".getBytes());
}
serverWebExchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
return serverWebExchange.getResponse().writeWith(Mono.just(dataBuffer));
}
else if (throwable instanceof CustomException) {
CustomExceptionex = (CustomException)throwable;
Map<String, Object> map = new HashMap<>();
map.put("data", null);
map.put("code", ex.getCode());
map.put("msg", ex.getMessage());
DataBuffer dataBuffer = null;
try {
dataBuffer = bufferFactory.wrap(objectMapper.writeValueAsBytes(map));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
serverWebExchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
return serverWebExchange.getResponse().writeWith(Mono.just(dataBuffer));
}
DataBuffer dataBuffer = bufferFactory.wrap("Unknown error".getBytes());
serverWebExchange.getResponse().setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
serverWebExchange.getResponse().getHeaders().setContentType(MediaType.TEXT_PLAIN);
return serverWebExchange.getResponse().writeWith(Mono.just(dataBuffer));
}
public class HttpError {
private String message;
HttpError(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
}