t77*_*777 4 java rest json jax-rs jersey-2.0
我有以下 POJO:
public class Order {
private String orderCode;
// And many more ... getters and setter
}
Run Code Online (Sandbox Code Playgroud)
以及以下 REST 资源:
@Path("/customers/{customercode}/orders")
public class OrderResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response create(@PathParam("customercode") String customerCode, Order order) {
// ...
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在一些客户端将一个Order对象作为 JSON发送到这个 URL。该customerCode参数获取设置为预期值,但order参数是null,虽然这里是一个有效的JSON体的请求。(我可以在ContainerRequestContext对象中看到它。)
Jersey 的日志没有说明任何问题(即使在调试模式下)。
有任何想法吗?蒂亚!(我正在与 Jackson 一起使用 Jersey 2)
因此,在您的过滤器中,您正在InputStream从ContainerRequestContext. 所以现在流是空的。这意味着当方法参数反序列化完成时没有数据留下。
解决此问题的一种方法是在读取实体之前对其进行缓冲。我们可以通过强制转换ContainerRequestContextto来做到这一点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);
}
Run Code Online (Sandbox Code Playgroud)
对 的调用bufferEntity()将完全按照方法名称的含义进行。此外,如果您熟悉使用客户端 API,则readEntity应该看起来很熟悉。它的工作方式与Response.readEntity(...). 它为MessageBodyReader入站内容类型寻找 a 。在MessageBodyReader为InputStream没有做什么特别的事情,只是返回原单流。所以如果你需要它,它就在那里。
| 归档时间: |
|
| 查看次数: |
947 次 |
| 最近记录: |