Jersey从ClientResponse转换为Response

时间:2012-06-07 17:21:38

标签: java jersey

我目前正在使用Jersey作为代理REST api来调用另一个RESTful Web服务。一些调用将在我的服务器中以最少的处理进行传递。

有没有办法干净利落地做到这一点?我正在考虑使用Jersey客户端进行REST调用,然后将ClientResponse转换为Response。这有可能还是有更好的方法来做到这一点?

一些示例代码:

@GET
@Path("/groups/{ownerID}")
@Produces("application/xml")
public String getDomainGroups(@PathParam("ownerID") String ownerID) {
    WebResource r = client.resource(URL_BASE + "/" + URL_GET_GROUPS + "/" + ownerID);
    String resp = r.get(String.class);
    return resp;
}

如果响应始终成功,则此方法有效,但如果另一台服务器上有404,则必须检查响应代码。换句话说,是否有干净的方式来回复我得到的回应?

2 个答案:

答案 0 :(得分:8)

据我所知,没有便利方法。你可以这样做:

public Response getDomainGroups(@PathParam("ownerID") String ownerID) {
    WebResource r = client.resource(URL_BASE + "/" + URL_GET_GROUPS + "/" + ownerID);
    ClientResponse resp = r.get(ClientResponse.class);
    return clientResponseToResponse(resp);
}

public static Response clientResponseToResponse(ClientResponse r) {
    // copy the status code
    ResponseBuilder rb = Response.status(r.getStatus());
    // copy all the headers
    for (Entry<String, List<String>> entry : r.getHeaders().entrySet()) {
        for (String value : entry.getValue()) {
            rb.header(entry.getKey(), value);
        }
    }
    // copy the entity
    rb.entity(r.getEntityInputStream());
    // return the response
    return rb.build();
}

答案 1 :(得分:2)

对我来说马丁的答案: JsonMappingException:找不到类sun.net.www.protocol.http.HttpURLConnection $ HttpInputStream 的序列化程序 改变

rb.entity(r.getEntityInputStream());

rb.entity(r.getEntity(new GenericType<String>(){}));

帮助。