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