У меня есть клиент Fiegn для отправки запроса на другой микросервис Springboot.
@ExceptionHandler(FeignException.class)
public ResponseEntity<ApiError> handleFeignException(FeignException ex, WebRequest webRequest) throws JsonProcessingException {
try{
ObjectMapper objectMapper = JsonMapper.builder()
.findAndAddModules()
.build();
ApiError apiError = objectMapper.readValue(ex.contentUTF8(), ApiError.class);
return new ResponseEntity<>(apiError, HttpStatusCode.valueOf(ex.status()));
} catch (JsonProcessingException e) {
log.error("Error deserializing Feign exception: {}", e.getMessage());
ApiError fallbackError = new ApiError("Error deserializing Feign exception", LocalDate.now(), ex.status(), webRequest.getDescription(false));
return ResponseEntity.status(HttpStatusCode.valueOf(ex.status()))
.body(fallbackError);
}
}
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class ApiError {
private String message;
private LocalDate timeStamp;
private int status;
private String requestPath;
}
Таким образом, я обрабатываю ложное исключение, выдаваемое симулирующим клиентом во время межсервисного взаимодействия между микросервисами весенней загрузки.... Есть ли другой хороший подход или я делаю это правильно?




У вас есть другой способ обработки исключений, но я мог бы предложить вам использовать специальную ErrorDecoder в соответствии с Пользовательской обработкой ошибок
на вики-странице OpenFeign.
В качестве примера:
public class CustomErrorDecoder implements ErrorDecoder {
@Override
public Exception decode(String methodKey, Response response) {
if (response.status() >= 400 && response.status() <= 499) {
return new StashClientException(
response.status(),
response.reason()
);
}
if (response.status() >= 500 && response.status() <= 599) {
return new StashServerException(
response.status(),
response.reason()
);
}
return errorStatus(methodKey, response);
}
}
После объявления создайте класс конфигурации. Помимо ErrorDecoder вы также можете объявить: пользовательские фильтры и перехватчики в этом классе.
@Configuration
public class MyFeignClientConfiguration {
@Bean
public ErrorDecoder errorDecoder() {
return new CustomErrorDecoder();
}
}
И в интерфейсе Feign у вас будет:
@FeignClient(
value = "myFeignClient",
configuration = MyFeignClientConfiguration.class
)