Java 11 Spring Boot捕获Mono 404错误返回204的实现
处理Spring Boot调用外部服务404转204的实现方案
我有一个Java 11 Spring Boot应用,调用外部Web服务时,无结果会返回404状态码,希望此时自身接口返回204状态码,因此需要捕获外部服务的404错误并转换为204响应。
原有实现代码
public UserDto[] getAllUser(String username) { return localApiClient.get().uri(baseUrl + username) .retrieve() .bodyToMono(UserDto[].class) .block(REQUEST_TIMEOUT); }
修正后的实现代码(修复语法问题并满足需求)
public UserDto[] getAllUser(String username) { return localApiClient.get().uri(baseUrl + username) .exchangeToMono(response -> { if (response.statusCode().equals(HttpStatus.OK)) { return response.bodyToMono(UserDto[].class); } if (response.statusCode().equals(HttpStatus.NOT_FOUND)) { // 外部返回404时,返回空数组对应204无内容逻辑 return Mono.just(new UserDto[0]); } else { // 其他异常状态码抛出原始异常,保留错误溯源能力 return response.createException().flatMap(Mono::error); } }) .block(REQUEST_TIMEOUT); }
关键实现说明
- 替换
retrieve为exchangeToMono:retrieve会自动将4xx/5xx状态码转为异常,exchangeToMono允许手动处理每一种响应状态码 - 404转换逻辑:外部返回404时返回空数组,上层接口可基于此返回204状态码(比如Controller方法配合
@ResponseStatus(HttpStatus.NO_CONTENT)注解) - 异常兜底:非200/404的状态码仍抛出原始异常,避免错误被隐藏
内容的提问来源于stack exchange,提问作者Jack Boch
相关产品推荐
相关产品推荐

