2016-11-04 4 views
2

Apache CXF JAX-RS 프로젝트에서 나는 Jackson이되도록 JSON 제공자를 구성했습니다. Jackson CXF의 기본 POST 요청 본문

이 일반적으로 작동하지만 클라이언트가 빈 몸 (NO JSON {})로 요청을 보내는 경우, 난 아직도 기본 POJO를 얻을 것 있도록 POST 요청 본문이 항상하지 null 싶습니다.

예.

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

CXF + 잭슨을 사용하여 빈 응답 기본 POJO를 얻을 수 수 없습니다. null 또는 NoContentException 중 하나를 결정할 수 있습니다.

답변이 명확하지 않습니다. JAX-RS specification 3.3.2.1은 엔티티 본문과 Java 형식 간의 변환이 엔티티 공급자의 책임임을 보증합니다. 인터페이스 MessageBodyReader는 InputStream로부터 유형을 읽기

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

자바

에 엔터티 본문을 매핑합니다.

엔티티 입력 스트림이 비어있는 경우 는 리더가 어느 길이 제로 엔티티의 자바 표시를 리턴하거나 어떤 길이 제로 엔티티 표시가 지원되는 Java 형 정의되지 않은 경우에 NoContentException 던져 예상

. NoContentException는, 서버 요구 엔티티를 읽는 동안, 메세지 본문 리더에 의해 슬로우되었을 경우, JAX-RS 서버 런타임에 의해, 원래의 NoContentException를 랩하는 BadRequestException에 자동적으로 변환되어 등록 된 예외 매퍼에 의해 표준 처리를 위해서 다시 슬로우됩니다.

"아니오 길이 제로의 실체"의 의미는 무엇인지 나를 위해 명확하지 않다. 어쨌든, 귀하의 경우 Jackson에서 엔터티 공급자의 책임입니다. 이 빈 스트림을 발견 한 경우에 ProviderBase의 readFrom() 메소드는 null를 돌려줍니다 JacksonJsonProviderMessageBodyReader

에 길이 제로의 실체를 해결하는 방법에 대해 잭슨의 팀

Read this post 논의. MessageBodyReader 및 JSR311의 javadoc에 따르면 이것은 허용되지 않습니다.

잭슨 팀 버그가 널 항상 반환, 새로운 사양 JAX-RS2.0을 읽는 고려, 그들은 수 기본값 true와 잭슨 2.4.0

JaxRSFeature.ALLOW_EMPTY_INPUT 

에서 새로운 매개 변수를 추가 이전 버전과 호환됩니다. 비활성화하면 오류가 발생합니다. JAX-RS 2.x의 NoContentExceptionIOException의 1.x