3

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

首先,如果我调用应该返回列表的 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的方式。

4

2 回答 2

4

回答您的问题

对于您的第一个问题:如果列表为空,则 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>

编辑

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

考虑这样定义的 Webservice 接口:

@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 服务发出请求。

于 2012-07-13T01:29:32.360 回答
0

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

在这个 SO question中讨论了另一种定义客户端的方法。@Autowired例如,有一个解决方案,在您提供一些额外配置后,您最终会使用注释。请参阅该问题的最后一个答案。

您提到的另一个问题是关于此 cxf List 相关问题,其中还告知了解决该问题的解决方案。所以这是一个错误。2.2.7 版本已修复,但在 2.2.9 版本再次出现问题。奇怪的是,直到您的版本 2.5.4 它又回到错误状态。如果它为您解决了问题,您仍然可以尝试解决此问题。

于 2012-07-11T19:07:33.880 回答