问题描述
|
我的静态方法返回一个“ 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批注并生成所需的输出。