У меня есть 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 , который имитирует мои проблемные части моего проекта.