Как реализовать декодер ошибок для нескольких симулированных клиентов - PullRequest
1 голос
/ 29 мая 2019

У меня есть несколько симулированных клиентов в приложении 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

Мой вопрос: Каков наилучший подход дляобрабатывает более одного симулированного исключения клиента?Должен ли я использовать тот же декодер ошибок и рассматривать их ответы как общее исключение?Или я должен создать декодер ошибок для каждого симулированного клиента?

...