【问题标题】:Jax.rs: What is the zero-length representation of an object?Jax.rs:什么是对象的零长度表示?
【发布时间】:2016-12-02 08:06:40
【问题描述】:

我有这个问题:

我们有一个这样的 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,但我不知道在哪里定义它。

对此有何见解?

【问题讨论】:

    标签: java web-services jax-rs


    【解决方案1】:

    我可能对此有误,但我认为 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;
    }
    

    【讨论】:

    • 一个空实体会自动发送一个 NO_CONTENT 响应状态。
    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 2017-07-24
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多