Как я могу получить CXF, чтобы понять карту? - PullRequest
3 голосов
/ 26 мая 2011

Мой метод restful возвращает Map<String,List<MyBean>>, но я не могу понять, как заставить CXF и JAXB сериализовать это как XML.

Я хочу, чтобы это выглядело примерно так (хотя я невсе, что беспокоило, как это сериализовано, пока оно работает с обеих сторон);

<response>
  <items key="a">
    <item>
      ....
    </item>
    <item>
      ....
    </item>
  </items>
  <items key="b">
    <item>
      ....
    </item>
  </items>
</response>

Если я просто верну Map, я получу;

[org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor] Для класса ответа HashMap не найден модуль записи тела сообщения.

Если я пытаюсь использовать объект-оболочку, то получаю;

[org.apache.cxf.jaxrs.provider.AbstractJAXBProvider] java.util.List является интерфейсом, а JAXB не может обрабатывать интерфейсы.

Есть предложения?Это просто проблема CXF (я использую версию 2.3.2)?Я уверен, что у меня была похожая вещь, работающая в Джерси.

Ответы [ 4 ]

3 голосов
/ 26 мая 2011

Нет ничего лучше, чем некоторое время от экрана, чтобы очистить разум. Я понял это за обедом, и ответ не в том, чтобы использовать Map, а в List из List упаковщиков.

@XmlRootElement
public class MyResponse {

  private List<ItemListWrapper> items;

  //getters and setters
}

@XmlType
public class ItemListWrapper {

  private String key;
  private List<Item> items;

  @XmlAttribute
  public String getKey() {
    return this.key;
  }

  //rest of the getters and setters

}

@XmlType
public class Item {
  //just a bean
}
1 голос
/ 26 мая 2011

ошибка произошла, потому что CXF не знает, что это за ключи и каковы объекты. вам нужно будет использовать aegis для указания привязки java Map to XML.

см. Раздел «Обработка карт» по этой ссылке: Отображение xfire и коллекции . (Я не смог найти документацию по Aegis Map / Collection для CXF, поэтому вместо этого приведена документация от xfire. Конфигурация aegis должна быть похожей, поскольку xfire 2.0 - CXF)

альтернативно, просто придерживайтесь Коллекций и Списков.

0 голосов
/ 11 июня 2011

Вы можете предоставить конфигурацию для обработчиков / поставщиков сообщений следующим образом, если вы используете CXF 2.3.2 с Spring:

<jaxrs:server id="restContainer" address="/">
    <jaxrs:serviceBeans>
        <ref bean="yourRestfulServiceBeanId"/>
    </jaxrs:serviceBeans>
    <jaxrs:extensionMappings>
        <entry key="xml" value="application/xml"/>
    </jaxrs:extensionMappings>
    <jaxrs:providers>
        <ref bean="jaxbXmlProvider"/>
    </jaxrs:providers>
</jaxrs:server>

<!-- Webservice message handlers -->  
<bean id="jaxbXmlProvider" class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
    <property name="jaxbElementClassMap" ref="propertiesMap"/>
</bean>

<util:map id="propertiesMap">
    <entry key="jaxb.formatted.output">
        <value type="java.lang.Boolean">true</value>
    </entry>
</util:map>

Обработчик увидит аннотации JAXB и сгенерирует требуемый вывод.

0 голосов
/ 26 мая 2011

Почему бы не попробовать использовать какую-то конкретную реализацию List?Или создайте собственного маршаллера, который попытается понять, с каким списком вы имеете дело.

http://fusesource.com/docs/esb/4.3.1/cxf_interceptors/CXFInterceptorIntro.html

http://cxf.apache.org/custom-cxf-transport.html

...