与Jackson

时间:2016-11-04 18:32:11

标签: java json jackson jax-rs cxf

在我正在进行的Apache CXF JAX-RS项目中,我已将JSON提供程序配置为Jackson

这通常有效,但我希望POST请求正文始终不是null,这样如果客户端发送一个空主体的请求(没有JSON {} ),我仍然会得到一个默认的POJO。

E.g。

CXF方面:

@POST
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
@Path("/foo")
public Response postFoo(FooObj foo) {
     if (foo == null)
         return Response.ok("No foo");
     else
         return Response.ok("Foo found");
}

客户方:

curl -XPOST -H "Content-Type: application/json" "http://localhost/foo"
"No Foo" // Though we'd like to see "Foo found"

1 个答案:

答案 0 :(得分:2)

使用CXF + Jackson获取使用空响应的默认POJO是不可能的。您可以在 null或NoContentException

之间做出决定

答案并不明显。 JAX-RS specification 3.3.2.1坚持认为实体主体和Java类型之间的转换是实体提供者的责任。接口MessageBodyReader将实体主体映射到Java

T readFrom(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String,String> httpHeaders,
     InputStream entityStream)
       throws IOException, WebApplicationException
     

从InputStream中读取一个类型。

     

如果实体输入流为空,读者应该返回零长度实体的Java表示,或者如果没有为受支持的Java类型定义零长度实体表示,则抛出NoContentException 即可。 NoContentException,如果在读取服务器请求实体时由消息体读取器抛出,则由JAX-RS服务器运行时自动转换为包装原始NoContentException的BadRequestException,并由注册的异常映射器重新进行标准处理。

我不清楚&#34;没有零长度实体&#34; 的含义是什么。在任何情况下,它都是实体提供者的责任,在您的情况下是杰克逊。

杰克逊团队的Read this post讨论如何处理JacksonJsonProvider MessageBodyReader

中的零长度实体
  

ProviderBase中的readFrom()方法遇到空流时返回null。根据MessageBodyReader和JSR311的javadoc,这是不允许的。

杰克逊团队考虑返回null总是一个bug,并且阅读新规范JAX-RS2.0,他们在Jackson 2.4.0中添加了一个新参数

JaxRSFeature.ALLOW_EMPTY_INPUT

默认值true与先前版本兼容。禁用时会引发错误。 JAX-RS 2.x为NoContentException,1.x

IOException