У меня есть @ RestController с методом:
@PostMapping
public ResponseEntity doSmth(@RequestBody String json){
...
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
RestTemplate restTemplate = new RestTemplate();
String url = "...";
HttpEntity<String> requestEntity = new HttpEntity<>("body", headers);
restTemplate.postForLocation(url, requestEntity);
....
}
Приложение, которое я звоню работаетследующим образом:
1. Возвращает responseEntity .
2. Если что-то пошло не так, оно выдает исключение .
Когда выдает исключение, благодаря обработчику исключений Он дает json в качестве ответа с информацией о проблеме.
Например,обработчик исключений для SomeException :
@RestController
@ControllerAdvice
public class SomeExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(SomeException.class)
public final ResponseEntity<ErrorDetails> handleUserNotFoundException(SomeException ex, WebRequest request) {
final HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
ErrorDetails errorDetails = new ErrorDetails(new Date(), status.value(), status.getReasonPhrase(), ex.getMessage(),
request.getDescription(false));
return new ResponseEntity<>(errorDetails, status);
ErrorDetails - просто POJO.Необходимо предоставить клиентам информацию об исключении.
Когда приложение, которое я вызываю с restTemplate, выдает исключение,
Я получаю Ошибка HttpServerError .
System.out.println(error); //org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 null
ПРОБЛЕМА :
Мне нужно знать, какое исключение было сгенерировано на другом сервере или какое сообщение с, но Он дает такой ответ для любогоисключение с любыми сообщениями.
ОБНОВЛЕНИЕ:
Почтальон на сервер:
1. @PostMapping
метод возвращает ResponseEntity
с пустым телом иЗаголовок location
(операция создания), поэтому клиент получает 201 код состояния CREATED
и местоположение.
2. Если что-то пошло не так, клиент получает json
, который представлен ErrorDetails
.
Сервер длясервер:
1. ResponseEntity responseEntity = restTemplate.postForObject(url,requestEntity, ResponseEntity.class);
Работает, но даже когда я пытаюсь использовать responseEntity.getHeaders()
- он не содержит localtion
.
2. Когда сервер выбрасывает SomeException extends RuntimeException
с его обработчиком- зависит от кода состояния, у меня есть некоторые исключения (HttpServerError for 5xx
).
Когда я использую postForUrl
, я получаю location
, но за исключением ситуации, такая же.