У меня есть несколько симулированных клиентов в приложении 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);
}
}
Я реализовал декодер ошибок для симулированного клиента1.
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 для использования этого декодера ошибок для этого конкретного клиента, например:
feign:
client:
config:
client1:
errorDecoder: feign.codec.ErrorDecoder.Default
Мой вопрос: Каков наилучший подход дляобрабатывает более одного симулированного исключения клиента?Должен ли я использовать тот же декодер ошибок и рассматривать их ответы как общее исключение?Или я должен создать декодер ошибок для каждого симулированного клиента?