转发ResponseEntity时,Spring REST服务会挂起

时间:2018-05-23 09:11:31

标签: 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
        }
    }
}

正如您所看到的,为避免RestTemplate围绕任何错误响应而导致创建状态为500的新响应的异常,我定义了一个客户ResponseErrorHandler。< / p>

我遇到的问题是,如果postForEntity返回HTTP状态与200不同的响应,则响应将永远不会到达调用方,该响应将挂起,直到超时达到他。< / p>

但是,如果我从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

感谢所有人。

0 个答案:

没有答案