Spring Boot возвращает обработанный пользовательский объект 401 из обработчика исключений - PullRequest
0 голосов
/ 28 июня 2018

У меня есть API-интерфейс Spring Boot rest, в котором есть LoginController для выполнения простых процессов аутентификации. Это действие проверки токена.

@PostMapping("validatetoken")
public ResponseEntity<ValidateTokenResponse> validateToken(
        @RequestBody ValidateTokenRequest validateTokenRequest, HttpServletRequest request) throws Exception {

    if (StringUtils.isEmpty(validateTokenRequest.getToken())) throw new AuthenticationFailedException("token parameter cannot be null or empty");

    Boolean isValid = authenticationService.validateToken(request, validateTokenRequest.getToken());
    ValidateTokenResponse response = new ValidateTokenResponse();
    response.setIsValid(isValid);
    response.setToken(validateTokenRequest.getToken());
    return new ResponseEntity<>(response, isValid? HttpStatus.OK : HttpStatus.UNAUTHORIZED);
}

И в моем API я перехватываю все ошибки в ResponseEntityExceptionHandler и преобразовываю пользовательский объект таким образом.

@ExceptionHandler(AuthenticationFailedException.class)
@ResponseBody
protected ResponseEntity<Object> handleAuthenticationFailed(AuthenticationFailedException ex) {
    LogManager.error(ex);
    ApiError apiError = new ApiError(HttpStatus.UNAUTHORIZED);
    apiError.setMessage(ex.getMessage());
    return buildResponseEntity(apiError);
}

Но когда я хочу вызвать этот API, используя RestTemplate, как показано ниже, я получаю исключение, например java.net.HttpRetryException: не могу повторить попытку из-за аутентификации на сервере в режиме потоковой передачи .

ResponseEntity<String> responseEntity =
    restTemplate.exchange(
        this.validateTokenUrl,
        HttpMethod.POST,
        requestHttpEntity,
        String.class);

Но если я изменю HttpStatus с ExceptionHandler на, кроме HttpStatus.UNAUTHORIZED, я могу получить истинный ApiError объект от клиента. Что может вызвать эту проблему и как я могу решить ее?

РЕДАКТИРОВАТЬ: Создано репозиторий github , который имитирует мои проблемные части моего проекта.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Чтобы было понятно, я предлагаю автоматическую привязку рестайта в отдельном конфигурационном файле с подробностями ниже

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

    SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
    requestFactory.setOutputStreaming(false);

    restTemplate.setRequestFactory(requestFactory);

    return restTemplate;
  }
0 голосов
/ 28 июня 2018

По умолчанию RestTemplate использует DefaultResponseErrorHandler. Этот обработчик ошибок выдает исключение при отправке ответа 4xx / 5xx из REST API.

Если вы хотите настраивать обработку ошибок, просто зарегистрируйте свой обработчик ошибок через restTemplate.setErrorHandler, где вы бы использовали реализацию интерфейса ResponseErrorHandler.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...