У меня проблема с использованием службы REST, созданной с помощью Spring Boot 1.5.Я разрабатываю службу REST, которая действует как прокси-сервер и пересылает запросы в другую службу REST, которая предоставляет тот же API.
@RestController
@RequestMapping("/user")
public class ProxyUserController {
// Some initialization code
@PostMapping
public ResponseEntity<?> add(@Valid @RequestBody User user) {
return restTemplate.postForEntity(userUrl, user, String.class);
}
@Configuration
public static class RestConfiguration {
@Bean
public RestTemplate restTemplate(UserErrorHandler errorHandler) {
return new RestTemplateBuilder().errorHandler(errorHandler).build();
}
}
@Component
public static class UserErrorHandler implements ResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) {
return false;
}
@Override
public void handleError(ClientHttpResponse response) {
// Empty body
}
}
}
Как видите, во избежание того, что RestTemplate
окружает любой ответ об ошибкеИсключение, которое вызывает создание нового ответа со статусом 500
, я определил клиента ResponseErrorHandler
.
Проблема, с которой я столкнулся, заключается в том, что если postForEntity
возвращает ответ с HTTP-статусом, отличным от 200
, ответ никогда не поступит вызывающей стороне, которая вешает трубку, пока время ожидания не достигнет его.
Однако, если я создаю новый ответ, начиная с ответа, возвращенного postForEntity
, все начинает работатьгладко.
@PostMapping
public ResponseEntity<?> add(@Valid @RequestBody User user) {
final ResponseEntity<?> response =
restTemplate.postForEntity(userUrl, user, String.class);
return ResponseEntity.status(response.getStatusCode()).body(response.getBody());
}
Что, черт возьми, происходит?Почему я не могу повторно использовать ResponseEntity
из другого звонка?
Спасибо всем.