繁体   English   中英

Apache CXF Web服务问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM