Spring RestTemplate: переопределение ResponseErrorHandler не работает при установке в классе конфигурации - PullRequest
0 голосов
/ 04 мая 2018

У меня есть RestTemplate, где я переопределяю ResponseErrorHandler, как показано в коде ниже

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
    restTemplate.setErrorHandler(new RsponseError());
    return restTemplate;
}

и мой класс ResponseError выглядит так

public class RsponseError implements ResponseErrorHandler{

@Override
public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException {
    log.info("statuscode {}",clientHttpResponse.getStatusCode());
    return true;
}

@Override
public void handleError(ClientHttpResponse clientHttpResponse) throws IOException {

    log.info("status code {}",clientHttpResponse.getStatusCode());
    log.info("status text {}",clientHttpResponse.getStatusText());

}

Если я автоматически подключу RestTemplate и вызову службу отдыха, и генерируется ошибка, ResponseError не работает. Но если я не установлю обработчик ошибок в Конфигурации и установлю его после автопроводки RestTemplate, как показано ниже, класс будет работать.

@Autowired
private RestTemplate restTemplate;


@Override
public ResponseEntity<ClassExampleResponse> invoker(ClassExample classExample,
                                                                String uri) throws Exception {
        final RequestEntity<ClassExample> requestEntity = new RequestEntity<>(classExample, requestHeader(), HttpMethod.POST, new URI("https://somelink"));
        restTemplate.setErrorHandler(new RsponseError());
        final ResponseEntity<ClassExampleResponse> responseEntity = restTemplate.exchange(requestEntity, ClassExampleResponse.class);
    return responseEntity;
}

Почему restTemplate.setErrorHandler (new RsponseError ()); не работает, если установлено в классе конфигурации? Спасибо за помощь заранее.

1 Ответ

0 голосов
/ 04 мая 2018

Вы можете использовать @ControllerAdvice, чтобы все ваши проблемы исчезли!

Вот краткий пример, который должен решить вашу проблему. Он берет вывод из вашей проверки бина и отображает его как JSON.

Вы можете взглянуть на один из моих предыдущих ответов. Это покроет некоторые детали, как это работает. Проверка бина в DropWizard с пользовательским выводом Json

@ExceptionHandler(MethodArgumentNotValidException.class)
@Order(1)
public ResponseEntity<ValidationErrors> handleUnexpectedException(MethodArgumentNotValidException errors) {

    ValidationErrors validationErrors = new ValidationErrors();

    for (FieldError fe : errors.getBindingResult().getFieldErrors()) {

        String field = fe.getField();
        String msg = fe.getDefaultMessage();

        validationErrors.add(field, msg);
    }
    return new ResponseEntity<ValidationErrors>(validationErrors, HttpStatus.UNPROCESSABLE_ENTITY);
}

public class ValidationErrors {

    public List<ValidationObject> errors = new ArrayList<ValidationObject>();

    public void add(String field, String error){
        errors.add(new ValidationObject(field, error));
    }
}


public class ValidationObject {

    private String field, error;

    public ValidationObject(String field, String error){
        this.field = field;
        this.error = error;
    }

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }
}
...