一、省略新建springboot项目过程

首先看下目录结构
目录结构

然后直接进入主题,上代码。

1、pom.xml

<dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-kernel</artifactId>
            <version>1.7.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-ant-plugin</artifactId>
            <version>1.7.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-corba</artifactId>
            <version>1.7.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-jaxws</artifactId>
            <version>1.7.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-spring</artifactId>
            <version>1.7.9</version>
        </dependency>

2、application.yml

server:
  port: 8090
logging:
  file: lmycc.log

3、准备工作做完,编写service

非常简单的一个方法

@Component
public class HelloService {
  public String sayHello(String name) {
    return "hello," + name;
  }
}

4、下面在springboot中配置axis2

1、services.xml编写

<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup>
    <service name="helloService">
        <parameter name="ServiceObjectSupplier">
            org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier
        </parameter>

        <!-- 暴露的Webservice服务Bean -->
        <parameter name="SpringBeanName">helloService</parameter>

        <!-- 关闭REST API 请求调用方式 -->
        <parameter name="disableREST" locked="false">true</parameter>

        <!-- 开启SOAP1.1协议请求 -->
        <parameter name="disableSOAP11" locked="true">false</parameter>

        <!-- 关闭SOAP1.2协议请求 -->
        <parameter name="disableSOAP12" locked="true">true</parameter>

    </service>

</serviceGroup>

2、springboot中配置axis2的services.xml

@Configuration
public class WebConfig {
  /**
   * Axis注入bean配置
   * 配置servlet的Bean,添加axis2
   */
  @Bean
  public ServletRegistrationBean myServletBean() {
    ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new AxisServlet(), "/services/*");
    String path = this.getClass().getResource("/WEB-INF").getPath();
    servletRegistrationBean.addInitParameter("axis2.repository.path", path);
    servletRegistrationBean.setLoadOnStartup(1);
    return servletRegistrationBean;
  }

5、 以上配置成功后,启动SpringbootApplication

1、启动SpringbootApplication,成功如图:
action
2、访问service的url:http://localhost:8090/services/helloService?wsdl,如下我们的webservice接口便是部署成功了:
url

webservice接口部署成功

二、下面进行webservice的调用

webservice接口的调用这里分为两种方式:RPC和客户端

1、使用RPC方式调用,简单方便

首先取到webservice接口的wsdl文件,找到其中要调用的url,method,namespace,还有参数的个数和类型,这里分别为:

  1. url :http://localhost:8090/services/helloService
  2. method:sayHello
  3. namespace:http://webservice.lmycc.com
  4. 参数
    • 数量:1
    • 类型:String

然后上代码:

public static void main(String[] args) {
    String url = "http://localhost:8090/services/helloService";
    String result = null;
    try {
      // 使用RPC方式调用WebService
      RPCServiceClient serviceClient = new RPCServiceClient();
      Options options = serviceClient.getOptions();
      // 指定调用WebService的URL
      EndpointReference targetEPR = new EndpointReference(url);
      options.setTo(targetEPR);
      // 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值
      // // 指定要调用的getWorld方法及WSDL文件的命名空间.....
      QName opAddEntry = new QName("http://webservice.lmycc.com", "sayHello");
      //
      // 指定getGreeting方法的参数值,如果有多个,继续往后面增加即可,不用指定参数的名称
      Object[] opAddEntryArgs = new Object[]{"lmycc"};
      // 返回参数类型,这个和axis1有点区别
      // invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;
      // 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
      // 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。
      // 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}
      // 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,
      // 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同
      // 指定getGreeting方法返回值的数据类型的Class对象.....
      Class[] classes = new Class[]{String.class};
      // 调用getGreeting方法并输出该方法的返回值.......
      result = (String) serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0];
      System.out.println(result);
    } catch (Exception e) {
      e.printStackTrace();
    }

RPC调用网上的例子有很多,这里也是参考了一些网上的例子,链接忘了这里就先不写了。我们主要看第二种客户端调用!

2、客户端方式调用webservice接口

准备工作:

  • 下载axis2-1.7.9-bin,并在本地新增环境变量
    -下载地址:axis2-1.7.9-bin.zip
  • 新增环境变量
    • 变量名:AXIS2_HOME
    • 变量值:H:\axis2-1.7.9
    • Path增加:%AXIS2_HOME%\bin

开始生成客户端,打开命令行执行:

wsdl2java -uri http://localhost:8090/services/helloService?wsdl -p com.lmycc.webservice -o stub

关于上面的wsdl2命令详解点这里

生成结果如下,两个文件:
客户端
将这两个文件复制到你的项目目录,最后进行进行接口调用
直接上代码:

public class TestCaseADB {

  public String getName(String name) {
    String result = "";
    try {
      HelloServiceStub.SayHello sayHello = new HelloServiceStub.SayHello();
      sayHello.setName(name);
      HelloServiceStub helloServiceStub = new HelloServiceStub();
      MyCallBackHandler myCallBackHandler = new MyCallBackHandler();
      HelloServiceStub.SayHelloResponse sayHelloResponse = helloServiceStub.sayHello(sayHello);
      myCallBackHandler.receiveResultSayHello(sayHelloResponse);
      helloServiceStub.startsayHello(sayHello, myCallBackHandler);
      result = sayHelloResponse.get_return();
    } catch (RemoteException e) {
      e.printStackTrace();
    }
    return result;
  }

  public static void main(String[] args) {
    TestCaseADB testClient = new TestCaseADB();
    String name = testClient.getName("lmycc");
    System.out.println(name);
  }

  static class MyCallBackHandler extends HelloServiceCallbackHandler {
    public void receiveResultSayHello(HelloServiceStub.SayHelloResponse result) {
      super.receiveResultsayHello(result);
    }
  }
}

最后附上源码地址:源码地址

有问题私信我

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐