在 jax-rs 中将包含 ByteBuffer 的 POJO 放入 Invocation.Builder.post 时出现 BadRequestException?

BadRequestException while putting POJO containing ByteBuffer in Invocation.Builder.post in jax-rs?

我正尝试在 Arquillian 测试中 post 如下所示的 POJO 实体 class。

MyPojo pojo = new MyPojo();
pojo.setBuffer(ByteBuffer.wrap("Happy new year".getBytes()); //this is the problem
pojo.setOtherFiled(someotherfield)

Client client = ClientBuilder.newClient();
Invocation.Builder builder = client.target(url).request(
            MediaType.APPLICATION_JSON_TYPE);

MyPojo response = builder.post(Entity.json(pojo), MyPojo.class);    

我的休息资源端点是这样的

 MyPojo myEndPoint(MyPojo pojoParam){
     //the body is immaterial since it's not going inside the body.
 }

我得到 javax.ws.rs.BadRequestException:HTTP 400 Bad Request

如果我注释掉 pojo.setBuffer(ByteBuffer.wrap("Happy new year".getBytes());,它不会给出那个错误。

上面的代码有什么问题如何改正?

我终于明白为什么会这样了。 Jackson 无法序列化 ByteBuffer,因为它是一个抽象 class。这不是直截了当的,它可能需要额外的类型信息。

在客户端我们发送 json(jackson 序列化 POJO)但是在传递给 rest 之前重建 POJO class终点,它无法从 json 重建 POJO class 的对象,因为它不知道如何创建 ByteBuffer 实例。

我通过尝试使用 jackson 在独立 class 中序列化和反序列化 ByteBuffer 来解决这个问题。它会抛出

org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.nio.ByteBuffer, problem: abstract types can only be instantiated with additional type information

Jackson在于Resteasy请求处理的预处理阶段。因此,Resteasy 给出了 400 bad request,因为它无法处理请求。

作为解决方法,我使用 byte[] 而不是 ByteBuffer 并将其转换为终点的 ByteBuffer 实例。

将 JSON 映射器升级到 fasterxml 将解决此问题。我已升级,问题已解决。

https://github.com/FasterXML/jackson