POST方法无法获取有效载荷对象。

4

我有以下的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) {
        // ...
    }

    // ...
}

现在有一些客户端以JSON格式向此URL发送一个Order对象。虽然请求中有一个有效的JSON主体(我可以在ContainerRequestContext对象中看到它),但customerCode参数被设置为预期值,但order参数却为null
Jersey的日志没有任何问题(即使在DEBUG模式下也是如此)。
有什么想法吗?谢谢!(我正在使用带Jackson的Jersey 2)

1
哦,所以你是从 ContainerRequestContext 中读取它的?这只是为了调试还是已经是你的应用程序的一部分(从上下文中读取请求)? - Paul Samsotha
@peeskillet 好的,我明白了。作为我的应用程序的一部分,我读取了流,现在它是空的 => null,作为一个Order - t777
2
这里有一个技巧。将 ContainerRequestContext 强制转换为 (ContainerRequest)。使用 ContainerRequest.bufferEntity(),然后使用 ContainerRequest.readEntity(Order.class) - Paul Samsotha
有没有一种方法可以获取原始内容(例如使用ContainerRequestContext.getEntityStream())而不需要知道任何类类型或媒体类型? - t777
1
readEntity(InputStream.class) 可能吗?如果你总是期望文本数据,那就用 String.class - Paul Samsotha
1个回答

5

所以在你的过滤器中,你正在从ContainerRequestContext读取InputStream。现在流是空的。这意味着当方法参数反序列化完成时没有数据剩余。

解决这个问题的一种方法是在读取之前缓冲实体。我们可以通过将ContainerRequestContext强制转换为{{link1: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的MessageBodyReaderInputStreamMessageBodyReader没有任何特殊功能,只是返回原始流。因此,如果需要,可以使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接