我正在尝试像下面在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());
,则没有给出该错误。
上述代码有什么问题,如何纠正?
最后,我弄清楚了为什么会这样。 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
实例。
将JSON映射器升级到fastxml将解决此问题。我已经升级,问题已为我解决。