WebService - CXF开发Server和Client(main方法测试)

简介: WebService - CXF开发Server和Client(main方法测试)

本篇简要记录使用jdk生成Stub进行service与client的测试,未与spring结合且未发布到tomcat容器,Server和Client都是使用的main方法。


篇末有第二种方式(客户端代理工厂)进行客户端开发示例。


这里使用的是CXF,引入jar永远是不可少的(自己下载引入)。



20171104181922905.png



【1】配置系统环境变量

如果使用jetty生成Stub来编写客户端项目,需要进行如下配置:


【2】编辑Service并进行发布

service的编写使用JAX-WS,直接使用注解进行声明,简单便捷。Service项目不需要额外的jar,Client项目需要博文头部提到的jar。

① 编写service接口

package com.web.service;
import javax.jws.WebMethod;
import javax.jws.WebService;
//这里使用了注解,声明为webservice接口
@WebService
public interface ServiceServer {
    //这里使用了注解,声明方法
    @WebMethod
    public String sayHello(String name);
}

② 编写其实现类

package com.web.service.impl;
import javax.jws.WebService;
import com.web.service.ServiceServer;
//这里使用了注解
@WebService
public class ServiceServerImpl implements ServiceServer{
    @Override
    public String sayHello(String name) {
        System.out.println("server sayHello "+name);
        return "hello"+name;
    }
}

③ 使用main方法进行发布

package com.web.service.impl;
import java.util.Date;
import javax.xml.ws.Endpoint;
public class ServerTest {
    public static void main(String[] args) {
        String address = "http://192.168.2.225:8989/ServiceServerImpl";
        Endpoint.publish(address , new ServiceServerImpl());
        System.out.println("webservice 发布成功!"+new Date());
    }
}


【3】根据address,查看并保存wsdl文件

① 浏览器中输入地址,查看wsdl


http://192.168.2.225:8989/ServiceServerImpl?wsdl


将其保存为test.wsdl放入客户端项目下(新建一个客户端项目)


<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://impl.service.web.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://service.web.com/" name="ServiceServerImplService" targetNamespace="http://impl.service.web.com/">
  <wsdl:import location="http://192.168.2.225:8989/ServiceServerImpl?wsdl=ServiceServer.wsdl" namespace="http://service.web.com/">
    </wsdl:import>
  <wsdl:binding name="ServiceServerImplServiceSoapBinding" type="ns1:ServiceServer">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="sayHello">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="sayHello">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="sayHelloResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="ServiceServerImplService">
    <wsdl:port binding="tns:ServiceServerImplServiceSoapBinding" name="ServiceServerImplPort">
      <soap:address location="http://192.168.2.225:8989/ServiceServerImpl"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

【4】根据wsdl生成Stub,进行客户端测试

① DOS进入客户端项目src路径


② 根据项目下的wsdl生成Stub

wsimport -keey url



③ 刷新项目,可以看到src下生成了service和impl


20171102211037014.png


另外,还可以直接根据wsdl的url地址生成Stub,不用再保存wsdl具体文件到项目下。

20171102211639772.png



上面两种方式都是使用jdk生成Stub,还可以使用如下命令使用jetty进行生成:

wsdl2java url

④ 编写main方法,进行客户端调用

package com.web.client;
import com.web.service.impl.ServiceServer;
import com.web.service.impl.ServiceServerImplService;
public class Client {
    public static void main(String[] args) {
        ServiceServerImplService factory = new ServiceServerImplService();
        ServiceServer serviceServerImplPort = factory.getServiceServerImplPort();
        System.out.println(serviceServerImplPort.getClass());
        String result = serviceServerImplPort.sayHello("Tom");
        System.out.println("Client "+result);
    }
}


客户端输出结果如下:


服务端输出结果如下:


项目源码与jar下载:http://download.csdn.net/download/j080624/10051042

【Tips】可以采用JaxWsProxyFactoryBean 如下方式:

package com.web.test;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.web.service.ServiceServer;
public class ClientTest2 {
    public static void main(String[] args) {
         //创建WebService客户端代理工厂
          JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
          //注册WebService接口
          factory.setServiceClass(ServiceServer.class);
          //设置WebService地址
          factory.setAddress("http://192.168.2.225:8888/redis/hello");
          ServiceServer serverService = (ServiceServer)factory.create();
          System.out.println("invoke webservice...");
          String sayHello = serverService.sayHello("Lucy");
          System.out.println("message context is:"+sayHello);   
    }
}
目录
相关文章
|
2月前
|
测试技术 API 项目管理
API测试方法
【10月更文挑战第18天】API测试方法
54 1
|
2月前
|
测试技术 UED
软件测试中的“灰盒”方法:一种平衡透明度与效率的策略
在软件开发的复杂世界中,确保产品质量和用户体验至关重要。本文将探讨一种被称为“灰盒测试”的方法,它结合了白盒和黑盒测试的优点,旨在提高测试效率同时保持一定程度的透明度。我们将通过具体案例分析,展示灰盒测试如何在实际工作中发挥作用,并讨论其对现代软件开发流程的影响。
|
1月前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
98 2
|
23天前
|
安全 测试技术 持续交付
云计算时代的软件开发与测试:高效、灵活、可扩展
云计算时代的软件开发与测试:高效、灵活、可扩展
|
2月前
|
人工智能 监控 测试技术
云应用开发平台测试
云应用开发平台测试
66 2
|
2月前
|
测试技术 Python
自动化测试项目学习笔记(三):Unittest加载测试用例的四种方法
本文介绍了使用Python的unittest框架来加载测试用例的四种方法,包括通过测试用例类、模块、路径和逐条加载测试用例。
84 0
自动化测试项目学习笔记(三):Unittest加载测试用例的四种方法
|
2月前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
68 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
2月前
|
测试技术 UED
软件测试中的探索性测试:一种高效且灵活的测试方法
本文将深入探讨探索性测试的核心概念、优势及其在实际项目中的应用。我们将从探索性测试的基本定义入手,逐步解析其在不同场景下的具体实施方法和最佳实践。通过详细的案例分析和方法对比,帮助读者全面了解这种既高效又灵活的软件测试技术。
|
2月前
|
安全 测试技术 API
一图看懂API测试9种方法
一图看懂API测试九种方法:冒烟测试验证基本功能,功能测试确保符合规格,集成测试检查组件协同工作,回归测试防止新变更引入问题,负载测试评估性能稳定性,压力测试挑战极限负载,安全测试发现并修复漏洞,用户界面测试确保UI与API协调,模糊测试提升异常数据处理鲁棒性。
|
2月前
|
测试技术 UED
软件测试中的探索性测试:一种创新的质量保证方法
在软件开发的生命周期中,测试阶段扮演着至关重要的角色。传统的软件测试方法,如自动化测试和回归测试,虽然在一定程度上保证了软件质量,但它们往往依赖于预定义的测试用例和脚本,可能无法覆盖所有用户场景和边缘情况。为了克服这些限制,探索性测试作为一种创新的质量保证方法应运而生。本文将深入探讨探索性测试的概念、优势以及如何有效地实施它,以帮助读者更好地理解和应用这种测试技术。