Сопоставление типов контента расширений в Apache CXF JAX-RS

JAX-RS предлагает прекрасный способ указать типы контента в @Produces, и платформа автоматически определит лучший тип контента из клиентского HTTP Accept. ] и, чудо из чудес, даже преобразовать ваш объект в этот тип (например, XML с использованием JAXB или JSON с использованием Jackson) при возврате информации вызывающей стороне.

Мой (рабочий) клиент, как это часто делают клиенты, усложнил простую работу, попросив указать тип контента по расширению в URL-адресе, например. API/widgets.json. Это заставит меня иметь различные методы getWidgetsXXX(), один с @Produces("application/json"), другой с @Produces("application/xml") и т. д.

Но я использую Apache CXF и был рад обнаружить, что могу настроить CXFдля сопоставления различных расширений с типами контента с помощью jaxrs.extensions. ] начальный параметр!



  jaxrs.extensions
  
    xml=application/xml
    json=application/json
  

Но я не могу найти абсолютно никакой документации о том, как это работает в реальном мире. Я наивно думал, что могу просто аннотировать метод с помощью пути с расширением, и он будет имитировать заголовок Accepts:

@Path("/widgets.{extension}")
@GET
@Produces({ "application/json", "application/xml" })
public List getWidgets();

Поэтому я вызываю его, используя api/widgets.json, и он возвращает XML! Что особенно странно, поскольку JAX-RS указывает, что тип содержимого по умолчанию является первым в списке.

Где я могу узнать, как использовать сопоставление типов содержимого расширения CXF?

П.С. Я не использую Spring.

5
задан Donal Fellows 6 April 2012 в 21:07
поделиться