post 方法未获取有效负载对象

post method does not get payload object

我有以下 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! (我在 Jackson 身上使用 Jersey 2)

因此在您的过滤器中,您正在从 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(...) 几乎相同。它为入站内容类型查找 MessageBodyReaderMessageBodyReader for InputStream 没有做任何特别的事情,只是 return 原始流。所以如果你需要它,它就在那里。