我有这个问题:
我们有一个像这样的JAX.RS api:
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Path("get")
public User get(@QueryParam(value = "id") String identifier) {
return toUser(getUserEntry(identifier));
}
toUser()方法可以返回null,这实际上意味着客户端将看到“ 204-No Content”响应。
现在,在客户端,我的代码如下所示:
getWebTarget("user")
.path("get")
.queryParam("id", identifier)
.request(getMediaType())
.get()
.readEntity(SsoUser.class);
我原本希望readEntity()抛出某种异常,但实际上它返回null且不会抱怨。
看着documentation,我看到了:
对于零长度的响应实体,它返回一个表示零长度数据的相应Java对象。如果没有为Java类型定义零长度表示,则将引发包装基础NoContentException的ProcessingException。
因此看来,我的
User
类确实定义了“零长度表示形式”。但是我在文档的任何地方都找不到这种表示的含义。我可以理解Java如何推断零长度表示形式为null,但是我不知道在哪里定义。
有什么见解吗?
最佳答案
我对此可能是错的,但是我不认为Jax-RS能够为您处理null
值。您可以做的是明确处理这种情况,例如
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Path("get")
public Response get(@QueryParam(value = "id") String identifier) {
User maybeNull = toUser(getUserEntry(identifier));
Response response = null;
if(null == maybeNull) {
response = Response.noContent().build();
} else {
response = Response.ok(maybeNull).build();
}
return response;
}