如何让CXF理解Map <String,<List <MyBean >>?

问题描述

| 我的静态方法返回一个“ 0”,但我不知道如何获取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版)吗?我确定我在泽西岛也有过类似的工作。     

解决方法

没有什么比离开屏幕更清晰的时间了。我在午餐时发现了这个问题,答案是根本不使用2英镑,而是4英镑的4英镑包装纸。
@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
}
    ,因为CXF不知道什么是键和什么是对象,所以发生了错误。 您将需要使用宙斯盾来指定java Map to XML绑定。 请参阅此链接中的“处理地图”部分:xfire映射和集合。 (我找不到CXF的“宙斯盾地图/收藏”文档,所以这里是xfire的文档。由于xfire 2.0是CXF,因此“宙斯盾”的配置应该相似) 或者,只需坚持收藏和清单。     ,为什么不尝试使用List的一些具体实现?或创建自己的编组器,该编组器将尝试了解您正在处理的列表类型。 http://fusesource.com/docs/esb/4.3.1/cxf_interceptors/CXFInterceptorIntro.html http://cxf.apache.org/custom-cxf-transport.html     ,如果将CXF 2.3.2与Spring结合使用,则可以按以下方式为msg-handlers / providers提供配置:
<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批注并生成所需的输出。