我正在使用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
调用不会引发异常,explicit
和runtime
。
我应该手动执行此操作,还是丢失了某些内容?
答案 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
。