Java 在jax rs中将包含ByteBuffer的POJO放入Invocation.Builder.post时出现BadRequestException?
我试图在Arquillian测试类中发布一个POJO实体,如下所示Java 在jax rs中将包含ByteBuffer的POJO放入Invocation.Builder.post时出现BadRequestException?,java,rest,jackson,jax-rs,wildfly,Java,Rest,Jackson,Jax Rs,Wildfly,我试图在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
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);
我的rest资源端点如下所示
MyPojo myEndPoint(MyPojo pojoParam){
//the body is immaterial since it's not going inside the body.
}
我得到了javax.ws.rs.BadRequestException:HTTP400错误请求
如果我注释掉pojo.setBuffer(ByteBuffer.wrap(“新年快乐”.getBytes());
,它不会给出那个错误
上面的代码有什么问题?如何更正它?最后我找到了原因。
Jackson
无法序列化ByteBuffer
,因为它是一个抽象类。它不是直接的,可能需要额外的类型信息
在客户端,我们发送json
(jackson序列化了POJO
),但在传递到rest
端点之前重构POJO
类时,它无法从json重构POJO类的对象,因为它不知道如何创建ByteBuffer
实例
我是通过在一个独立类中尝试使用jackson
对ByteBuffer
进行序列化和反序列化来实现的。它将
org.codehaus.jackson.map.JsonMappingException:无法构造java.nio.ByteBuffer的实例,问题:抽象类型只能使用其他类型信息进行实例化
Jackson
处于Resteasy
中请求处理的预处理阶段。因此,Resteasy
正在发出400错误请求,因为它无法处理该请求
作为一种解决方法,我正在使用byte[]
而不是ByteBuffer
,并在最后将其转换为ByteBuffer
实例。将JSON映射器升级为fasterxml将解决此问题。我已升级,问题已为我解决
字符串必须是ByteBuffer吗?如果改用字符串会发生什么?我怀疑Entity.json不知道如何编码ByteBuffers。@PeterLawrey实例变量的类型是ByteBuffer
内MyPojo
,所以我应该作为字节缓冲区发送。实际上,这是我原始代码的缩小版本,它代表使问题复杂化。@PeterLawrey当我使用其他数据类型而不是ByteBuffer时,例如byte array,它正在工作。我们使用jackson。这是一个问题吗?只是出于好奇,你希望如何用JSON表示ByteBuffer
。@peeskillet这是一个问题。在资源端点,我不关心JSON表示但是用MyPojo表示,它是无缝的。