前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【十二】springboot整合WebService

【十二】springboot整合WebService

作者头像
小z666
发布2024-06-21 18:02:24
810
发布2024-06-21 18:02:24
举报
文章被收录于专栏:javajava
介绍:接下来我会把学习阶段学到的框架等知识点进行整合,每一次整合是在前一章的基础上进行的,所以后面的整合不会重复放前面的代码。每次的demo我放在结尾,本次是接着上一章的内容延续的,只增加新增的或者修改的代码。 上一章整合了异步调用,并获取了异步调用的返回值,本章将进行WebService的整合。 使用场景:在开发时,可能会使用到别的团队或者其他开放接口的数据,并不全是自己进行数据处理,这种情况下就需要访问别人的接口或者,将自己的接口开放给别人使用。

下面将开始进行webservice的整合以及讲解如何编写作为服务端以及客户端如何请求。

首先展示一下我的目录结构:

我是在前面13章整合的代码上进行添加的,所以我会框选出新增部分代码。

服务端:

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16
watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

​​

​​

客户端:

​​

​​

目录结构展示完毕(事实上,为了方便,客户端的代码我是复制的服务端的代码,都是简单的Springboot项目,也可以自己新建),可以看到我将服务端的端口号设置的8089,客户端的端口号是8090。

第一步:导入依赖

代码语言:javascript
复制
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--swagger        -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!--swagger的swagger-ui.html模式        -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!--swagger的doc.html模式        -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.9.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20190722</version>
        </dependency>

        <!-- mybatis plus 代码生成器 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.5.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
            <version>2.5.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
            <version>2.5.1</version>
        </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>

    </dependencies>

其中,这三个依赖是本章新增的依赖:

​​

第二步:编写服务端接口

​​

注意:一定要加上WebService注解。

第三步:编写服务端接口实现类

​​

注意:一定要加上WebService注解。

到此,该服务端接口已经形成, 现在要做的就是将该接口暴露出来,所以新建一个配置类,如下:

第四步:编写服务端暴露接口的配置类

代码语言:javascript
复制
package com.swagger.demo.config;

import com.swagger.demo.service.CodeService;
import com.swagger.demo.service.impl.CodeServiceImpl;
import javax.xml.ws.Endpoint;
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;

/**
 * @ClassName WebServiceConfig
 * @Description TODO
 * @Author zrc
 * @Date 15:08
 * @Version 1.0
 **/
@Configuration
public class WebServiceConfig {

    @Bean(name = "cxfServlet")  // 注入servlet bean name不能dispatcherServlet ,否则会覆盖dispatcherServlet
     public ServletRegistrationBean<CXFServlet> cxfServlet() {
                 return new ServletRegistrationBean<CXFServlet>(new CXFServlet(), "/webservice/*");
             }
    @Bean
    public CodeService codeService() {
                 return new CodeServiceImpl();
             }

     @Bean(name = Bus.DEFAULT_BUS_ID)
     public SpringBus springBus() {
                 return new SpringBus();
             }
     @Bean
     public Endpoint endpoint() {
                 // 参数二,是SEI实现类对象
                 EndpointImpl endpoint = new EndpointImpl(this.springBus(), this.codeService());
                 // 发布服务
                 endpoint.publish("/userService");
                 return endpoint;
             }

}

注意:不要引错包。

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16
watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

​​

  • 1:注意不要忘记configuration注解
  • 2:注意命名,不要命名成dispatcherServlet,不然会报错。
  • 3:我觉得就固定写法嘛,反正请求时类似http://localhost:8089/webservice/userService?wsdl
  • 4:就是你要开放的接口的接口类型。
  • 5:就是你要开放的接口的接口类型的实现类。
  • 6:就是你想要将你的接口暴露出来之后,别人使用时的名字,自己拟定一个。

服务端的编写到此就结束了,特别简单。

第五步:编写客户端controller

客户端的调用就更简单了,我为了方便,直接把调用写在controller了。比如,我的一个接口需要使用到服务端(模拟的别人的接口)的接口返回的数据,我的接口编写如下:

代码语言:javascript
复制
package com.swagger.demo.controller;

import com.swagger.demo.model.entity.Code;
import com.swagger.demo.service.CodeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * UserController类
 *
 * <p>
 * <b>History:</b>
 * <table border="1">
 * <tr>
 * <th>Date</th>
 * <th>Operator</th>
 * <th>Memo</th>
 * </tr>
 * <tr>
 * <td>2021/8/25 17:51</td>
 * <td>zrc</td>
 * <td>Create</td>
 * </tr>
 * </table>
 *
 * @author zrc
 * @version 1.0.0
 * @since 1.0.0
 */
@Api(tags = "热点数据接口")
@RestController
@RequestMapping("codeController")
public class CodeController {

    @Autowired
    private CodeService codeService;

    /**
     * 静态变量:系统日志
     */
    private static final Log logger = LogFactory.getLog(CodeController.class);

    @ApiOperation(value = "测试webservice")
    @PostMapping("/testWebservice")
    public List<Code> testWebservice() throws InterruptedException {
                         // 接口地址
                         String address = "http://localhost:8089/webservice/userService?wsdl";
                         // 代理工厂
                         JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
                         // 设置代理地址
                         jaxWsProxyFactoryBean.setAddress(address);
                         // 设置接口类型
                         jaxWsProxyFactoryBean.setServiceClass(CodeService.class);
                         // 创建一个代理接口实现
        codeService = (CodeService) jaxWsProxyFactoryBean.create();
                         // 调用代理接口的方法调用并返回结果
                         List<Code> codes = codeService.getCodes();
                         System.out.println("返回结果: " + codes);
                        return codes;
    }

}
watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16
watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

​​

注意:不要引错包。

服务端接口地址的使用如上。

第六步:编写客户端接口

特别注意:服务端的接口,在客户端也需要建立相同的接口,如下:

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16
watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

​​

特别注意:

  • 1、此处的方法名和返回值需要和服务端的一致。
  • 2、两个注解都不要漏掉,漏掉一个都会报错。

第七步:演示

由于前面已经整合了swagger,所以我直接启动客户端和服务端,然后打开客户端的在线swagger进行演示,如下:

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16
watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

​​

从图中可以看到接口已经请求到了数据,但是从上面的客户端接口编写可以看到,其实我们并没有写该接口的具体业务,所以是调用的服务端的getCodes方法获取的数据,整合成功。

本期整合到此完毕,接下来会继续更新加强整合,尽情期待。

客户端访问地址:http://localhost:8090/swagger-ui.html或者http://localhost:8090/doc.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍:接下来我会把学习阶段学到的框架等知识点进行整合,每一次整合是在前一章的基础上进行的,所以后面的整合不会重复放前面的代码。每次的demo我放在结尾,本次是接着上一章的内容延续的,只增加新增的或者修改的代码。 上一章整合了异步调用,并获取了异步调用的返回值,本章将进行WebService的整合。 使用场景:在开发时,可能会使用到别的团队或者其他开放接口的数据,并不全是自己进行数据处理,这种情况下就需要访问别人的接口或者,将自己的接口开放给别人使用。
  • 第一步:导入依赖
  • 第二步:编写服务端接口
  • 第三步:编写服务端接口实现类
  • 第四步:编写服务端暴露接口的配置类
  • 第五步:编写客户端controller
  • 第六步:编写客户端接口
  • 第七步:演示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档