java - Apache CXF 网络服务问题

标签 java web-services spring spring-mvc cxf

我有一个使用 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 上注入(inject)这个 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>

编辑

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

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

@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 一样注入(inject)它,例如,要么以这种方式注入(inject)它:

 <bean id="consumerBean" class="...">
    <property name="deviceWS" ref="deviceWSClient">
 </bean>

或使用 @Autowired

@Autowired IDWebService deviceWSClient

或用户 @Resource

@Resource IDWebService deviceWSClient

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

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

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

关于java - Apache CXF 网络服务问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11384986/

相关文章:

java - Serenity Screenplay 从 CLI 运行测试

php - 如何强制在类别上使用我的 ID,而不是 prestashop 类别的自动增量。普斯塔商店

web-services - 通过 Web 服务并使用 WS-Security 发送二进制数据

vb.net - .NET 网络服务。 (ASMX) 如何塑造请求和响应消息?

java - spring mvc项目中的org.springframework.beans.factory.BeanCreationException

java - 如何添加 UsernameTokenInterceptor cxf 拦截器

java - 仅检索字符串中大写的单词

java - 使用时间戳更新的线程安全集?

java - 排序() "cannot find symbol"

spring - 在 Web 应用程序中使用 spring 的 jta