我有一个 Feign 客户端,其方法返回 feign.Response
类。当另一个服务抛出异常时,feign
会在响应正文中放置异常消息并放置状态,但我的服务不会抛出异常。我可以根据收到的响应抛出异常,就像使用 ResponseEntity
时一样。
假客户端
@FeignClient(name = "ms-filestorage")
@RequestMapping(value = "/files", produces = "application/json")
public interface FileStorageApi {
@GetMapping(value = "/{id}")
Response getFileById(@PathVariable String id);
}
客户端的使用
@Override
public Response getFileFromStorage(String fileId) {
Response fileStorageResponse = fileStorageApi.getFileById(fileId);
// NOW I USE THIS WAY FOR CHECKING RESPONSE BUT IT DOESN'T LOOK GOOD
//if (fileStorageResponse.status() != HttpStatus.OK.value()) {
// throw new OsagoServiceException();
//}
return fileStorageResponse;
}
最佳答案
通常,如果 Feign 客户端调用从其所调用的 API 接收到错误响应,则会抛出 FeignException
。
这可以在 try/catch block 中捕获(如果您想更复杂,则可以在 Feign ErrorDecoder
中捕获,但那是另一篇文章了)。
但是,如果将错误响应映射到 Feign.Response
返回类型,则情况并非如此 - 请参阅 this Github issue 。
您应该创建一个自定义 Java 对象来保存响应,而不是从 getFileFromStorage()
返回 Feign.Response
,然后您就可以访问 FeignException
您可以根据需要进行处理。
请注意,如果您不需要访问从正在调用的 API 返回的数据,将返回类型更改为 void
也可以解决此问题。
关于java - 如何根据feign.Response抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56852486/