post方法没有获得有效负载对象

时间:2015-07-27 15:50:17

标签: 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对象中看到它。)

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

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

1 个答案:

答案 0 :(得分:3)

因此,在您的过滤器中,您正在阅读InputStream中的ContainerRequestContext。所以现在流是空的。这意味着在完成方法参数反序列化时没有剩余数据。

解决这个问题的一种方法是在读取之前缓冲实体。我们可以通过将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没有做任何特别的事情,只是返回原始流。所以,如果你需要它,那就是它。