Jersey Client 2.19不会对错误状态代码抛出异常

时间:2015-07-27 14:59:28

标签: java exception jax-rs jersey-client

我正在使用Rest Client构建jersey-client 2.19

public ReleaseEntity createRelease(ReleaseEntity newRelease, int workspaceId) {

    Releases wrapper = new Releases();
    wrapper.setData(Arrays.asList(newRelease));

    WebTarget target = client.target(urlPrefix)
            .path(AgmUrls.getReleasesUrl(workspaceId));

    wrapper = target
            .request()
            .accept(MediaType.APPLICATION_JSON)
            .post(Entity.entity(wrapper, MediaType.APPLICATION_JSON))
            .readEntity(Releases.class);

    return wrapper.getData().get(0); 
} 

客户端在constructor

中初始化
this.client = ClientBuilder.newClient();

问题是,如果回复错误,post调用不会引发异常,explicitruntime

我应该手动执行此操作,还是丢失了某些内容?

2 个答案:

答案 0 :(得分:2)

这个问题已经过时了,但更好地防止他人重复同样的错误......

而不是

result = target
            .request()
            .accept(MediaType.APPLICATION_JSON)
            .post(Entity.entity(input, MediaType.APPLICATION_JSON))
            .readEntity(Releases.class);

post(entity)返回调用了Response的{​​{1}},最好使用重载readEntity,它会在错误状态代码上抛出post(entity, responseType)

WebApplicationException

JAX-RS中的每个http方法都有这样的重载方法,用于读取响应或表示对象。在任何情况下,强烈建议阅读表示对象消耗潜在的响应主体。

// throws runtime exception derived from WebApplicationException
// on error-statuscodes
result = target
            .request()
            .accept(MediaType.APPLICATION_JSON)
            .post(Entity.entity(input, MediaType.APPLICATION_JSON), Releases.class);

不幸的是,当必须读取response-header时,仍然需要读取// consumes response as string and guarantees to close the http call. // A no-arg delete(); would be a potential leak! target.request().delete(String.class); 而不是表示对象。

答案 1 :(得分:0)

框架不应该抛出异常。用户应该在他们认为合适的情况下处理响应。这对任何客户都是一样的。 Response对象将包含您认为合适的处理响应所需的所有上下文。

所以你应该做的是先获得Response

Response response = target
         .request()
         .accept(MediaType.APPLICATION_JSON)
         .post(Entity.entity(wrapper, MediaType.APPLICATION_JSON));

然后你可以查看状态

int status = response.getStatus();

然后处理状态

if (status == 200) {
    wrapper = response.readEntity(Releases.class);
    ...
} else { 
    handleOtherStatus();   
}

如果你没有先得到Response,那么你不知道实际问题是什么,因为readEntity(...)会失败(因为它不是你期望的身体),并抛出一个不同的例外。如果你想告诉用户实际问题是什么,至少你有Response