//全局異常處理類
@Configuration
public class GlobalExceptionConfiguration implements ErrorWebExceptionHandler {
//日志對象
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionConfiguration.class);
private static final ObjectMapper objectMapper = new ObjectMapper();
@Override //參數1: request response ex:出現異常時異常對象
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
Map<String, String> result = new HashMap<>();
//1.獲取響應對象
ServerHttpResponse response = exchange.getResponse();
//2.response是否結束 多個異常處理時候
if (response.isCommitted()) {
return Mono.error(ex);
}
//2.設置響應頭類型
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
//3.設置響應狀態嗎
if (ex instanceof IllegalTokenException) {
response.setStatusCode(HttpStatus.FORBIDDEN);
} else {
response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
}
//4.設置響應內容
return response
.writeWith(Mono.fromSupplier(() -> {
DataBufferFactory bufferFactory = response.bufferFactory();
result.put("msg", ex.getMessage());
try {
return bufferFactory.wrap(objectMapper.writeValueAsBytes(result));
} catch (JsonProcessingException e) {
e.printStackTrace();
return null;
}
}));
}
}