Spring Boot REST端点连接未释放

时间:2019-05-15 18:07:42

标签: rest spring-boot

我已经创建了Spring boot(2.1.4.RELEASE)REST端点来从服务器获取一些数据。当我从浏览器调用此终结点时,在浏览器窗口中看到JSON,但我注意到fav图标中的微调器将持续60秒。当我查看“网络”标签时,我再也看不到请求的响应部分。 60秒后,它表示失败。当我遍历调试器中的代码时,我看到数据正在从控制器中返回,并且当我“播放”其余的堆栈时,一切都完成了(分配给服务于请求的线程),我有点不解这种行为。

@GetMapping(path="/recipes")
public ResponseEntity<Collection<HpManifest>> getRecipes() {
    ResponseEntity<Collection<HpManifest>> response = hpService.getRecipes();
    return response;
}

public ResponseEntity<Collection<HpManifest>> getRecipes() {
    logger.info("Retrieving recipes from");

    UriComponentsBuilder builder = 
            UriComponentsBuilder.fromHttpUrl(endpointManifests)
                .queryParam("type", HpManifestType.RECIPE.getType());

    logger.info("REST endpoint: " + builder.toUriString());

    ResponseEntity<Collection<HpManifest>> recipes = restTemplate.exchange(
            builder.toUriString(), 
            HttpMethod.GET, null, new ParameterizedTypeReference<Collection<HpManifest>>() {});

    logger.info("recipes are:");
    recipes.getBody().forEach(r -> logger.info(r.toString()));

    return recipes;
}

enter image description here

1 个答案:

答案 0 :(得分:1)

前几天,我遇到了类似的问题。在我的情况下,事实证明recipes(从restTemplate.exchange方法返回)的标头中包含Transfer-Encoding: chunked,然后当您返回recipes时,您的spring框架是可能还包含一个Content-Length标头。这两个标头的组合在对浏览器的响应中可能会导致问题,因为浏览器认为它正在获取分块的数据,但实际上并非如此。我建议根据以下内容从您的ResponseEntity变量中创建一个新的recipes

return ResponseEntity.status(recipes.getStatusCode()).body(response.getBody());

或者,您可以强制Spring框架返回分块数据,但是我认为这不是正确的方法。