我有一些客户客户端要发送其他微服务请求。
@FeignClient(name="userservice")
public interface UserClient {
@RequestMapping(
method= RequestMethod.GET,
path = "/userlist")
String getUserByid(@RequestParam(value ="id") String id);
}
现在我正在发送这样的请求
try {
String responseData = userClient.getUserByid(id);
return responseData;
}
catch(FeignException e)
{
logger.error("Failed to get user", id);
}
catch (Exception e)
{
logger.error("Failed to get user", id);
}
这里的问题是,如果发生任何FeignException,我没有得到任何错误代码。
我需要在其他APIS中发送相应的错误代码以发送给调用者
那么如何提取错误代码?我想提取错误代码并建立一个responseEntity
我有this代码,但是不知道我可以在函数中使用多少代码。
答案 0 :(得分:3)
我参加聚会迟到了,但这是我的 2 美分。我们有相同的用例来根据错误代码处理异常,我们使用了 custom ErrorDecoder
。
public class CustomErrorDecoder implements ErrorDecoder {
@Override
public Exception decode(String methodKey, Response response) {
String requestUrl = response.request().url();
Response.Body responseBody = response.body();
HttpStatus responseStatus = HttpStatus.valueOf(response.status());
if (responseStatus.is5xxServerError()) {
return new RestApiServerException(requestUrl, responseBody);
} else if (responseStatus.is4xxClientError()) {
return new RestApiClientException(requestUrl, responseBody);
} else {
return new Exception("Generic exception");
}
}
}
在 @Bean
类中返回上述类的 FeignClientConfiguration
。
public class MyFeignClientConfiguration {
@Bean
public ErrorDecoder errorDecoder() {
return new CustomErrorDecoder();
}
}
将此用作 FeignClient 的配置类。
@FeignClient(value = "myFeignClient", configuration = MyFeignClientConfiguration.class)
然后您可以使用 GlobalExceptionHandler
处理这些异常。
答案 1 :(得分:0)
您是否尝试在伪装客户端上实现FallbackFactory?
在create方法上,返回之前,您可以使用以下代码段获取http状态代码:
String httpStatus = cause instanceof FeignException ? Integer.toString(((FeignException) cause).status()) : "";
示例:
@FeignClient(name="userservice", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {
@RequestMapping(
method= RequestMethod.GET,
path = "/userlist")
String getUserByid(@RequestParam(value ="id") String id);
}
@Component
static class UserClientFallbackFactory implements FallbackFactory<UserClient> {
@Override
public UserClient create(Throwable cause) {
String httpStatus = cause instanceof FeignException ? Integer.toString(((FeignException) cause).status()) : "";
return new UserClient() {
@Override
public String getUserByid() {
logger.error(httpStatus);
// what you want to answer back (logger, exception catch by a ControllerAdvice, etc)
}
};
}
}
答案 2 :(得分:0)
不是同一问题,但这对我的情况有所帮助。 OpenFeign的FeignException不会绑定到特定的HTTP状态(即不使用Spring的@ResponseStatus批注),这使得Spring在遇到FeignException时默认为500。没关系,因为FeignException可能有许多与特定HTTP状态无关的原因。
但是,您可以更改Spring处理FeignExceptions的方式。只需定义一个处理FeignException的ExceptionHandler
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(FeignException.class)
public String handleFeignStatusException(FeignException e, HttpServletResponse response) {
response.setStatus(e.status());
return "feignError";
}
}
该示例使Spring返回您收到的HTTP状态
答案 3 :(得分:-1)
有一个ErrorDecored接口,就像在documentation
中所说的那样上面关于FallbackFactory的答案是可行的,但可以归入其他抽象层次。