信息发布→ 登录 注册 退出

SpringBoot整合WebService服务的实现代码

发布时间:2026-01-11

点击量:
目录
  • 为什么使用WebService?
    • 适用场景: 
    • 不适用场景:
  • Axis2与CXF的区别
    • SpringBoot使用CXF集成WebService

      WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。 其实WebService并不是什么神秘的东西,它就是一个可以远程调用的类,或者说是组件,把你本地的功能开放出去共别人调用。

      为什么使用WebService?

      简单解释一下WebService,比如你的项目需要查询某银行账户余额。你能直接查吗,肯定不行,因为数据库是银行的,他不可能给你权限。你想访问他的数据库获取数据,这就需要用到WebService。通过调用银行暴露的接口来得到你想要的数据。

      适用场景: 

      软件的集成和复用,如气象局(服务端系统)、天气查询网站等。

      • 发布一个服务(对内/对外),不考虑客户端类型,不考虑性能,建议WebService
      • 服务端已经确定使用webservice,客户端不能选择,必须使用WebService

      软件集成:通过远程调用技术,将两个系统整合到一起,从而实现软件集成。

      软件复用:同一个款软件的多次集成,最终实现复用。

      不适用场景:

      • 考虑性能时不建议使用WebService
      • 同构程序下不建议使用WebService

      Axis2与CXF的区别

      目前java开发WebService的框架主要包括Axis2和CXF,如果你需要多语言的支持,你应该选择Axis2。如果你需要把你的实现侧重java并希望和Spring集成,CXF就是更好的选择,特别是把你的WebService嵌入其他的程序中。

      区别Axis2CXF
      简述WebService引擎简易的SOA框架,可以作为ESB
      spring集成不支持支持
      应用集成困难简单
      是否跨语言
      部署方式web应用嵌入式
      服务的管控和治理支持不支持

      SpringBoot使用CXF集成WebService

      1.向pom.xml中添加集成WebService的相关依赖

        <dependency>
      			<groupId>org.springframework.boot</groupId>
      			<artifactId>spring-boot-starter-web-services</artifactId>
      		</dependency>
      		<dependency>
      			<groupId>org.apache.cxf</groupId>
      			<artifactId>cxf-rt-frontend-jaxws</artifactId>
      			<version>3.1.6</version>
      		</dependency>
      		<dependency>
      			<groupId>org.apache.cxf</groupId>
      			<artifactId>cxf-rt-transports-http</artifactId>
      			<version>3.1.6</version>
      		</dependency>

      2.创建服务端接口

      package com.primeton.mq.service;
       
      import javax.jws.WebService;
      @WebService(name = "DemoService", // 暴露服务名称
          targetNamespace = "http://service.mq.primeton.com"// 命名空间,一般是接口的包名倒序
      )
      public interface DemoService {
          public String sayHello(String user);
      }

      3.创建服务端接口实现类

      package com.primeton.mq.service.impl;
       
      import com.primeton.mq.service.DemoService;
      import javax.jws.WebService;
      import java.util.Date;
      @WebService(serviceName = "DemoService", // 与接口中指定的name一致
              targetNamespace = "http://service.mq.primeton.com", // 与接口中的命名空间一致,一般是接口的包名倒
              endpointInterface = "com.primeton.mq.service.DemoService"// 接口地址
      )
      public class DemoServiceImpl implements DemoService {
          @Override
          public String sayHello(String user) {
              return user+",现在时间:"+"("+new Date()+")";
          }
      }

      4.创建CXF配置类

      package com.primeton.mq.webServiceConfig;
       
      import com.primeton.mq.service.DemoService;
      import com.primeton.mq.service.impl.DemoServiceImpl;
      import org.apache.cxf.Bus;
      import org.apache.cxf.bus.spring.SpringBus;
      import org.apache.cxf.jaxws.EndpointImpl;
      import org.apache.cxf.transport.servlet.CXFServlet;
      import org.springframework.boot.web.servlet.ServletRegistrationBean;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import javax.xml.ws.Endpoint;
      @Configuration
      public class CxfConfig {
          @Bean
          public ServletRegistrationBean dispatcherServlet() {
              return new ServletRegistrationBean(new CXFServlet(),"/demo/*");
          }
          @Bean(name = Bus.DEFAULT_BUS_ID)
          public SpringBus springBus() {
              return new SpringBus();
          public DemoService demoService() {
              return new DemoServiceImpl();
          public Endpoint endpoint() {
              EndpointImpl endpoint = new EndpointImpl(springBus(), demoService());
              endpoint.publish("/api");
              return endpoint;
      }

      5.启动SpringBoot服务

      输入http://localhost:8090/demo/api?wsdl即可,注意我设置的端口是8090,视情况而定。

      6.创建客户端

      在idea中进入File > New Project…菜单打开新建项目窗口,依次选择Java、WebServices,Version项选择Apache Axis,Libraries项选择 Download。然后点击Next按钮进入下一页。

      在下一页中输入项目名称,然后点击Finish按钮开始下载依赖包。依赖包下载完成后进入新建的项目。

      选WebServices > Generate Wsdl From Java Code,生成wsdl

      然后选择服务地址

      确定之后,创建一个测试类,代码如下:

      package test;
       
      import example.DemoServiceImplService;
      public class demo {
          public static void main(String[] args) {
              DemoServiceImplService webServiceImpl = new DemoServiceImplService();
              String result = webServiceImpl.getDemoServiceImplPort().sayHello("没有说");
              System.out.println("===========================================");
              System.out.println(result);
          }
      }

      注意:实现WebService客户端不一定要生成客户端的代码,可以通过地址动态调用。

      package com.primeton.mq.test;
       
      import com.primeton.mq.service.DemoService;
      import org.apache.cxf.endpoint.Client;
      import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
      import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
      import org.apache.cxf.transport.http.HTTPConduit;
      import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
      public class demo {
          public static void main(String[] args) {
              //创建动态客户端
              JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
              Client client = factory.createClient("http://localhost:8090/demo/api?wsdl");
              // 需要密码的情况需要加上用户名和密码
              //client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD));
              HTTPConduit conduit = (HTTPConduit) client.getConduit();
              HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
              httpClientPolicy.setConnectionTimeout(2000);  //连接超时
              httpClientPolicy.setAllowChunking(false);    //取消块编码
              httpClientPolicy.setReceiveTimeout(120000);     //响应超时
              conduit.setClient(httpClientPolicy);
              //client.getOutInterceptors().addAll(interceptors);//设置拦截器
            try{
                Object[] objects = new Object[0];
                // invoke("方法名",参数1,参数2,参数3....);
                objects = client.invoke("sayHello", "sujin");
                System.out.println("返回数据:" + objects[0]);
            }catch (Exception e){
                e.printStackTrace();
            }
      }
      在线客服
      服务热线

      服务热线

      4008888355

      微信咨询
      二维码
      返回顶部
      ×二维码

      截屏,微信识别二维码

      打开微信

      微信号已复制,请打开微信添加咨询详情!