2016-11-04 59 views
2

在我正在处理的Apache CXF JAX-RS项目中,我已将JSON提供程序配置为JacksonApache CXF默认POST请求正文与杰克逊

这通常工作,但我想在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

这是不可能得到一个默认的POJO利用CXF +杰克逊空的响应。您可以在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。

目前还不清楚“没有零长度实体”的含义。无论如何,这是实体提供者的责任,在你的案例中杰克逊。

杰克逊的球队Read this post讨论有关如何在JacksonJsonProviderMessageBodyReader

中的ProviderBase的readFrom()方法时,遇到一个空流返回null处理长度为零的实体。根据MessageBodyReader的javadoc和JSR311,这是不允许的。

杰克逊团队考虑返回null始终是一个错误,并读取新的规范JAX-RS2.0,他们在杰克逊2.4.0

JaxRSFeature.ALLOW_EMPTY_INPUT 

添加新的参数使用默认值true是与以前的版本兼容。禁用时会引发错误。对于JAX-RS 2.x和IOException 1.x

对于JAX-RS 2.x和 NoContentException