2016-11-04 3 views
2

В проекте Apache CXF JAX-RS, над которым я работаю, я настроил поставщика JSON как Jackson.Тело запроса POST по умолчанию Apache CXF с 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

Это не возможно получить 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 от нулевой длины объекта в или бросить NoContentException в случае не представление объекта нулевой длины не определенно для поддерживаемого типа Java , Исключение NoContentException, если оно выдается читателем тела сообщения при чтении объекта запроса сервера, автоматически переводится с помощью среды выполнения JAX-RS в исключение BadRequestException, которое обертывает исходное исключение NoContentException и возвращается для стандартной обработки зарегистрированными агентами исключения.

Это не для меня ясно, что смысл «не нулевой длины объекта». В любом случае, это ответственность поставщика организации, в вашем случае Джексона.

Read this post команды Джексона обсуждал о том, как иметь дело с сущностями нулевой длиной в JacksonJsonProviderMessageBodyReader

Метод readFrom() в ProviderBase возвращает нуль, когда он сталкивается с пустым потоком. В соответствии с javadoc для MessageBodyReader и JSR311 это недопустимо.

Джексон команда считают возвращение нулевой всегда является ошибкой, и чтение новой спецификации JAX-RS2.0, они добавить новый параметр в Джексон 2.4.0

JaxRSFeature.ALLOW_EMPTY_INPUT 

со значением по умолчанию true быть совместимый с предыдущими версиями. При отключении он вызовет ошибку. NoContentException для JAX-RS 2.x и IOException с 1.x

Смежные вопросы