Java-Apache CXF Web服务问题

提问

我有一个使用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请求,我想它是从本地存储库获取依赖的.我认为我需要的是在控制器上注入此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.

考虑这样定义的Web服务接口:

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

如果返回的列表为空列表,则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启动服务器,然后运行测试org.bk.memberservice.TestCxfIntegrationTest,它将向CXF服务发出请求.