Spring REST 服务在转发 ResponseEntity 时挂起

ric*_*din 5 java spring-boot spring-restcontroller

我在使用由 Spring Boot 1.5 组成的 REST 服务时遇到问题。我正在开发一个充当代理的 REST 服务,将请求转发到另一个公开相同 API 的 REST 服务。

@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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,为了避免RestTemplate任何错误响应出现异常,从而导致创建带有 status 的新响应500,我定义了一个 customer ResponseErrorHandler

我面临的问题是,如果postForEntity返回的响应的 HTTP Status 不同于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());
}
Run Code Online (Sandbox Code Playgroud)

这到底是怎么回事?为什么我不能重复使用ResponseEntity来自另一个呼叫的电话?

谢谢大家。