[英]Apache CXF web services problems
我有一个使用Maven的多模块项目。 在其中一个模块中,我有几个使用Apache CXF Framework 2.5.4开发的Web服务。 目前我有两个“问题”或问题。
首先,如果我调用其中一个应返回List的Web服务的方法,如果列表为空,则返回“null”而不是空列表。 我试图找出可能是什么问题,如果它是我正在使用的CXF版本的错误,或者我应该使用一些注释来修改方法或响应的定义,但我找不到任何东西。 我见过一些人有同样的问题,但没有解决方案。
我想问的另一件事是:我正在使用MVC模式开发一个Web应用程序。 我想知道我应该从Controller调用Web服务的方式,而不是使用ClasspathXmlCpplicationContext然后使用context.getBean()。
例如,客户端上的一个Web服务的bean定义是:
<jaxws:client id="deviceWSClient"
serviceClass="..IDeviceWebService"
address="http://localhost:8080/../DeviceWS" />
我已经尝试过@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<MemberDetail> memberDetails;
如果我返回一个空的memberDetails,那么通过网络的xml就是:
<ns2:searchMemberResponse xmlns:ns2="http://bk.org/memberservice/">
<ns2:MemberSearchResponse>
<memberDetails/>
</ns2:MemberSearchResponse>
</ns2:searchMemberResponse>
编辑
它作为上面的包装器类型的一部分被正确处理,但是如果不返回包装器类型,则DOES返回null,直接返回列表。
考虑以这种方式定义的Webservice接口:
@WebMethod(operationName = "searchMember")
List<MemberDetail> searchMember(@WebParam(name = "MemberSearchRequest") MemberSearchRequest memberSearchRequest);
如果返回的List是一个空列表,它也会被CXF 2.6.1序列化为null。
解决方法是使用包装类型
编辑结束
对于你的第二个问题:
您正在以这种方式创建客户端bean:
<jaxws:client id="deviceWSClient"
serviceClass="..IDeviceWebService"
address="http://localhost:8080/../DeviceWS" />
一旦你以这种方式创建了一个Spring bean,就可以像普通的Spring bean一样对待它,并按照你对普通Spring bean的方式进行注入,例如,以这种方式注入它:
<bean id="consumerBean" class="...">
<property name="deviceWS" ref="deviceWSClient">
</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版本它回到错误状态。 如果它能解决您的问题,您可以继续尝试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.