我有以下 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 寻找 MessageBodyReader
。 MessageBodyReader
for InputStream
没有做任何特别的事情,只是返回原始流。因此,如果您需要它,它就在这里。
关于java - post 方法没有得到 payload 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31657634/