Служба Spring REST зависает при пересылке ResponseEntity - PullRequest
0 голосов
/ 23 мая 2018

У меня проблема с использованием службы 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 из другого звонка?

Спасибо всем.

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