BadRequestException,同时将包含ByteBuffer的POJO放在jax-rs中的Invocation.Builder.post中?

问题描述 投票:0回答:2

我正在尝试像下面在Arquillian测试类中发布POJO实体。

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());,则没有给出该错误。

上述代码有什么问题,如何纠正?

java rest jackson jax-rs wildfly
2个回答
0
投票

最后,我弄清楚了为什么会这样。 Jackson无法序列化ByteBuffer,因为它是抽象类。这不是直接的,可能需要其他类型信息。

在客户端,我们发送json(杰克逊将POJO序列化),但是当在传递到POJO端点之前重建rest类时,它无法从json重建POJO类的对象因为它不知道如何创建ByteBuffer实例。

我通过尝试使用jackson在独立类中对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实例。


0
投票

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

https://github.com/FasterXML/jackson

© www.soinside.com 2019 - 2024. All rights reserved.