Apache CXF Web服务问题

我有一个使用Maven的多模块项目。 在其中一个模块中,我有几个使用Apache CXF Framework 2.5.4开发的Web服务。 目前我有两个“问题”或问题。

首先,如果我调用一个应该返回List的Web服务的方法,如果列表为空,则返回“null”而不是空列表。 我试图找出可能是什么问题,如果它是我正在使用的CXF版本的错误,或者我应该使用一些注释来修改方法或响应的定义,但我找不到任何东西。 我见过一些人有同样的问题,但没有解决方案。

我想问的另一件事是:我正在使用MVC模式开发一个Web应用程序。 我想知道我应该从Controller调用Web服务的方式,而不是使用ClasspathXmlCpplicationContext然后使用context.getBean()。

例如,客户端上的一个Web服务的bean定义是:

 

我已经尝试过@Autowired或@WebServiceRef注释。 有了这些它可以工作,但没有对Web服务做HTTP请求,我想它从本地存储库获取依赖。 我认为我需要的是在Controller上注入这个bean的方法。

回答你的问题

对于您的第一个问题:如果列表为空,则由CXF版本2.6.1正确处理 – 该服务返回空。 只是为了演示我有一个样本服务,其中类型以这种方式定义:

 @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "MemberSearchResponse", namespace="http://bk.org/memberservice/" ) public class MemberSearchResponse { @XmlElementWrapper(name="memberDetails") private List memberDetails; 

如果我在上面返回一个空的memberDetails,那么通过网络的xml是这样的:

       

编辑

它作为上面的包装器类型的一部分被正确处理,但是如果不是返回包装器类型,则DOES返回null,直接返回列表。

考虑以这种方式定义的Webservice接口:

 @WebMethod(operationName = "searchMember") List searchMember(@WebParam(name = "MemberSearchRequest") MemberSearchRequest memberSearchRequest); 

如果返回的List是一个空列表,它也会被CXF 2.6.1序列化为null。

解决方法是使用包装类型

编辑结束

对于你的第二个问题:

您正在以这种方式创建客户端bean:

  

一旦你用这种方式创建了一个Spring bean,就可以像普通的Spring bean一样对待它,并按照你对普通Spring bean的方式进行注入,例如,以这种方式注入它:

     

或使用@Autowired

 @Autowired IDWebService deviceWSClient 

或用户@Resource

 @Resource IDWebService deviceWSClient 

这些是注入bean的常用方法。

我在这个github位置有一个示例应用程序,您可以使用: https : //github.com/bijukunjummen/memberservice-codefirst.git

只需使用mvn tomcat:run启动服务器mvn tomcat:run并运行测试org.bk.memberservice.TestCxfIntegrationTest ,它将向CXF服务发出请求。

如果您在Spring论坛上关注此链接,@ @WebServiceRef可能会有效。 在那里你使用不同的方式进行jaxws配置。 请参阅列表中的最后一篇文章。

在这个SO问题上讨论了定义客户端的另一种方法。 有一个解决方案,你在给出一些额外的配置后最终使用@Autowired注释。 请参阅有关该问题的最后答案。

您提到的另一个问题是关于此cxf列表相关问题 ,其中还告诉解决方案解决问题的方法。 所以这是一个错误。 版本2.2.7已修复,但在版本2.2.9中再次出现问题。 很奇怪,直到你的版本2.5.4它回到错误状态。 如果它能解决你的问题,你可以尝试一下这个问题。