我有以下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)
答案 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(...)
非常相似。它会为入站内容类型查找MessageBodyReader
。 MessageBodyReader
for InputStream
没有做任何特别的事情,只是返回原始流。所以,如果你需要它,那就是它。