在 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 将解决此问题。我已升级,问题已解决。
我正尝试在 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 将解决此问题。我已升级,问题已解决。