REST响应 - 通过readEntity(String.class)记录有效负载失败

时间:2016-10-27 08:30:39

标签: java rest jersey illegalstateexception

考虑在Jersey 2.22.2下运行的REST代理的此代码:

@POST
@Produces(MediaType.APPLICATION_JSON)
@Path("/foo")
public Response foo(String request) {

    logger.info("Request to /foo :\n" + request);

    WebTarget target = ClientBuilder.newClient().target(esbWsUrl).path("/foo");
    Response response = target.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.entity(request, MediaType.APPLICATION_JSON_TYPE));

    // problem is in the 2 lines below
    logger.info("Buffered: " + response.bufferEntity());
    logger.info("Response from /foo :\n" + response.readEntity(String.class));

    return response;
}

首先,我在没有response.bufferedEntity()的情况下尝试了此操作并获得了IllegalStateException,因为response.readEntity(String.class)Response中的基础流消耗。

当我使用response.bufferEntity()时,我能够多次调用response.readEntity(String.class)(缓冲似乎有效),但Jersey返回的响应给出了零字节响应。

$ curl -m 5 -i -X POST -d '{"input_values": "abc"}' http://localhost:9000/services/rest/foo
HTTP/1.1 200 OK
Date: Thu, 27 Oct 2016 08:18:09 GMT
Keep-Alive: timeout=20
X-Type: default
Server: nginx
Content-Type: application/json; charset=UTF-8
Content-Length: 364

curl: (28) Operation timed out after 5000 milliseconds with 0 out of 364 bytes received

一些相关的文档在这里:Response.readEntity

在返回有效的Response之前,有人可以告诉我如何记录Response的内容吗?

可能有一些我没有想到的流处理问题,或者可能是将Response实体转换为字符串的另一种方法(不使用流)。

1 个答案:

答案 0 :(得分:0)

我最终根据前一个的状态代码和实体创建了一个全新的Response