如何让CXF理解Map <string,<list <mybean =“”>&gt;?</string,>

时间:2011-05-26 11:21:27

标签: java jaxb cxf jax-rs

我的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 个答案:

答案 0 :(得分:3)

没有什么比离屏幕更远的时间来清除一个人的想法了。我在午餐时想到了这一点,答案是不要使用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 :(得分:1)

发生错误是因为CXF不知道键是什么以及对象是什么。 您将需要使用aegis来指定Java Map到XML绑定。

请参阅此链接中的“处理地图”部分:xfire mapping and collections。 (我找不到CXF的aegis Map / Collection文档,所以这里是来自xfire的文档。由于xfire 2.0是CXF,所以aegis配置应该类似)

或者,只需坚持收藏和列表。

答案 2 :(得分:0)

为什么不尝试使用List的一些具体实现?或者创建自己的marshaller,试图了解你正在处理的列表类型。

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

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

答案 3 :(得分:0)

如果在Spring中使用CXF 2.3.2,可以按如下方式为msg处理程序/提供程序提供配置:

<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注释并生成所需的输出。