我的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版本)?我确信我在泽西岛也有类似的事情。
答案 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
答案 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注释并生成所需的输出。