У меня есть несколько поддельных клиентов в приложении Spring Boot. Я использую совет контроллера для обработки пользовательских исключений для каждого воображаемого клиента.
Вот мой совет контроллера, который обрабатывает два настраиваемых исключения (по одному для каждого клиента: client1 и client2):
@ControllerAdvice
public class ExceptionTranslator implements ProblemHandling {
@ExceptionHandler
public ResponseEntity<Problem> handleCustomClient1Exception(CustomException1 ex, NativeWebRequest request) {
Problem problem = Problem.builder()
.title(ex.getTitle())
.detail(ex.getMessage())
.status(ex.getStatusType())
.code(ex.getCode())
.build();
return create(ex, problem, request);
}
@ExceptionHandler
public ResponseEntity<Problem> handleCustomClient2Exception(CustomException2 ex, NativeWebRequest request) {
Problem problem = Problem.builder()
.title(ex.getTitle())
.detail(ex.getMessage())
.status(ex.getStatusType())
.code(ex.getCode())
.build();
return create(ex, problem, request);
}
}
Я реализовал декодер ошибок для симуляции client1.
public class ClientErrorDecoder implements ErrorDecoder {
final ObjectMapper mapper;
public ClientErrorDecoder() {
this.mapper = new ObjectMapper();
}
@Override
public Exception decode(String methodKey, Response response) {
ExceptionDTO exceptionDTO;
try {
exceptionDTO = mapper.readValue(response.body().asInputStream(), ExceptionDTO.class);
} catch (IOException e) {
throw new RuntimeException("Failed to process response body.", e);
}
return new CustomException1(exceptionDTO.getDetail(), exceptionDTO.getCode(), exceptionDTO.getTitle(), exceptionDTO.getStatus());
}
}
Я также настроил симуляцию для использования этого декодера ошибок для этого конкретного клиента следующим образом:
feign:
client:
config:
client1:
errorDecoder: feign.codec.ErrorDecoder.Default
Мой вопрос: как лучше всего обрабатывать более одного ложного клиентского исключения? Должен ли я использовать тот же декодер ошибок и рассматривать их ответы как общее исключение? Или мне нужно создать декодер ошибок для каждого симулятора клиента?