java - post 方法没有得到 payload 对象

标签 java json rest jax-rs jersey-2.0

我有以下 POJO:

public class Order {

    private String orderCode;

    // And many more ... getters and setter

}

以及以下 REST 资源:

@Path("/customers/{customercode}/orders")
public class OrderResource {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response create(@PathParam("customercode") String customerCode, Order order) {
        // ...
    }

    // ...
}

现在一些客户端将 Order 对象作为 JSON 发送到此 URL。 customerCode 参数设置为预期值,但 order 参数为 null,尽管这是请求中的有效 JSON 正文。 (我可以在 ContainerRequestContext 对象中看到它。)

Jersey 的日志没有说明任何问题(即使在 DEBUG 模式下)。

有什么想法吗? TIA! (我正在使用 Jersey 2 和 Jackson)

最佳答案

所以在您的过滤器中,您正在从 ContainerRequestContext 中读取 InputStream。所以现在流是空的。这意味着当方法参数反序列化完成时没有留下数据。

解决此问题的一种方法是在读取实体之前对其进行缓冲。我们可以通过将 ContainerRequestContext 转换为 ContainerRequest 来做到这一点,这将为我们提供更多与上下文交互的方法。

@Override
public void filter(ContainerRequestContext requestContext) {
    ContainerRequest containerRequest = (ContainerRequest)requestContext;
    containerRequest.bufferEntity();
    Order order = containerRequest.readEntity(Order.classs);
    // or
    InputStream in = containerRequest.readEntity(InputStream.class);
}

bufferEntity() 的调用将完全按照方法名称的含义进行操作。此外,如果您熟悉使用客户端 API,readEntity 应该看起来很熟悉。它的工作方式与 Response.readEntity(...) 几乎相同。它为入站 Content-Type 寻找 MessageBodyReaderMessageBodyReader for InputStream没有做任何特别的事情,只是返回原始流。因此,如果您需要它,它就在这里。

关于java - post 方法没有得到 payload 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31657634/

相关文章:

java - 填充二维数组

java - 最小化 Java 中的可见性

javascript - 解析 JSON 文件并存储到 Backbone 集合中,错误 : __ is undefined

java - OffsetDateTime 在 GET 方法中产生 "No injection source found for a parameter of type public javax.ws.rs.core.response"

python - 如何向 Flask Restful 服务构造函数发送参数?

java - 在 Java 中获取给定周数、星期几和年份的日期

java - 为什么URLClassLoader不加载类?

json - 预期返回 JSON 的单元测试方法示例

javascript - 从脚本标签使用 Json 键时未定义

java - Spring Integration 文件处理将其发送到 http