我在使用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
?
感谢所有人。