【问题标题】:post method does not get payload objectpost方法没有得到payload对象
【发布时间】:2015-10-17 21:45:41
【问题描述】:

我有以下 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 模式下)。

有什么想法吗?蒂亚! (我正在使用 Jersey 2 和 Jackson)

【问题讨论】:

  • 嗯...所以你是从ContainerRequestContext 读到的?这只是为了调试还是已经成为您应用程序的一部分(从上下文中读取请求)?
  • @peeskillet 好的。我知道了。我读取了流(作为我的应用程序的一部分),现在它是空的 => null as Order
  • 这里有个技巧。将ContainerRequestContext 转换为(ContainerRequest)。使用ContainerRequest.bufferEntity(),然后使用ContainerRequest.readEntity(Order.class)
  • 有没有办法在不知道任何类类型或媒体类型的情况下获取原始内容(如ContainerRequestContext.getEntityStream())?
  • readEntity(InputStream.class) 也许??或 String.class 如果您总是期待文本数据

标签: java json rest jax-rs jersey-2.0


【解决方案1】:

因此,在您的过滤器中,您正在从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 查找 MessageBodyReaderMessageBodyReader for InputStream 没有做任何特别的事情,只是返回原始流。所以,如果你需要它,它就在那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 2015-03-19
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多