在我正在进行的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"
答案 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