Результат шаблона Rest становится нулевым в вызове API при весенней загрузке - PullRequest
1 голос
/ 23 января 2020

Я использую приведенный ниже код для вызова удаленного API для удаления идентификатора пользователя (http://localhost: 8080 / remove ).

try {
final RestTemplate restTemplate = new RestTemplate();
    final UriComponentsBuilder builder = 
UriComponentsBuilder.fromUriString(url);
    builder.queryParam("acdc_id", acdcId);
ResponseEntity<ServiceResponse> result =
            restTemplate.exchange(
                builder.toUriString(),
                HttpMethod.DELETE,
                null,
                ServiceResponse.class);
}catch(Exception e){
//exception handling
}

Удаленный API возвращает 200 http-код для успешного выполнения (работает нормально), но когда какой-то идентификатор пользователя будет недоступен, API будет отправлен под пользовательским ответом:

{
"error code": "404",
"error": "USER ID Node not found : xyz"
} 

У меня уже есть ServiceResponse. java класс, чтобы получить ответ выше, но шаблон отдыха возвращается с ошибкой ниже в этом случае.

org.springframework.web.client.HttpClientErrorException$NotFound: 404 null
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:85)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:778)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:736)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:670)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:579) 

Мой класс ServiceResponse:

@JsonIgnoreProperties(ignoreUnknown = true)
public class ServiceResponse {

@JsonProperty(value = "error code")
private String errorCode;

@JsonProperty(value = "error")
private String error;

/**
 * @return the error.
 */
public String getError() {
    return error;
}

/**
 * @param error The error to set.
 */
public void setError(final String error) {
    this.error = error;
}

/**
 * @return the errorCode.
 */
public String getErrorCode() {
    return errorCode;
}

/**
 * @param errorCode The errorCode to set.
 */
public void setErrorCode(final String errorCode) {
    this.errorCode = errorCode;
}

}

Не могли бы вы помочь мне решить эту проблему или предоставить какие-либо рекомендации, как получить правильный ответ от API вместо нулевой ошибки

Ответы [ 2 ]

1 голос
/ 23 января 2020

Как я уже упоминал в комментарии , вы получаете HttpClientErrorException, который должен быть перехвачен и обработан. Вы ловите весь класс Exception, но в нем нет кода. Или вы можете использовать @ControllerAdvice и @ExceptionHandler вместе для достижения этой цели.

0 голосов
/ 23 января 2020

Вы можете использовать аннотацию Controller Advice @ControllerAdvice для обработки исключений. Вы можете отправить пользовательский ответ из метода. Вы можете определить exceptionHandler для HttpClientErrorException и отправить настраиваемый ответ от этого метода.

Пожалуйста, проверьте https://www.tutorialspoint.com/spring_boot/spring_boot_exception_handling.htm для получения дополнительной информации.

Еще один вариант - вы можете использовать что-то CustomResponseErrorHandler как показано ниже

@Component
public class RestTemplateResponseErrorHandler 
  implements ResponseErrorHandler {

    @Override
    public boolean hasError(ClientHttpResponse httpResponse) 
      throws IOException {

        return (
          httpResponse.getStatusCode().series() == CLIENT_ERROR 
          || httpResponse.getStatusCode().series() == SERVER_ERROR);
    }

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

        if (httpResponse.getStatusCode()
          .series() == HttpStatus.Series.SERVER_ERROR) {
            // handle SERVER_ERROR
        } else if (httpResponse.getStatusCode()
          .series() == HttpStatus.Series.CLIENT_ERROR) {
            // handle CLIENT_ERROR
            if (httpResponse.getStatusCode() == HttpStatus.NOT_FOUND) {
                throw new NotFoundException();
            }
        }
    }
}

А затем используйте его как

@Bean
    RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setErrorHandler(new RestTemplateResponseErrorHandler());

        return restTemplate;
    }

Пожалуйста, проверьте https://www.baeldung.com/spring-rest-template-error-handling для ResponseErrorHandler

...