【十二】springboot整合WebService 您所在的位置:网站首页 webservice接口调用返回null 【十二】springboot整合WebService

【十二】springboot整合WebService

2024-06-02 08:58| 来源: 网络整理| 查看: 265

互相交流入口地址  整体目录:

【一】springboot整合swagger

【二】springboot整合自定义swagger

【三】springboot整合token

【四】springboot整合mybatis-plus

【五】springboot整合mybatis-plus

【六】springboot整合redis

【七】springboot整合AOP实现日志操作

【八】springboot整合定时任务

【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存

【十】springboot整合quartz实现定时任务优化

【十一】springboot整合异步调用并获取返回值

【十二】springboot整合WebService

【十三】springboot整合WebService关于传参数

【十四】springboot整合WebSocket

【十五】springboot整合WebSocket实现聊天室

【十六】RabbitMQ基础篇(下载安装并基础使用,内含各种坑问题)

【十七】RabbitMQ基础篇(延迟队列和死信队列实战)

【十八】springboot实现自定义全局异常处理

【十九】初学Kafka并实战整合SpringCloudStream进行使用

【二十】springboot整合ElasticSearch实战(万字篇)

【二十一】springboot整合过滤器实战

【二十二】springboot整合拦截器实战并对比过滤器

【二十三】springboot整合activiti7(1)实战演示篇

【二十四】springboot整合spring事务详解以及实战

【二十五】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十六】springboot整合jedis和redisson布隆过滤器处理缓存穿透

【二十七】springboot实现多线程事务处理

【二十八】springboot之threadLocal参数解析器实现session一样保存当前登录功能 

【二十九】springboot整合logback实现日志管理

【三十】springboot项目上高并发解决示例

目录

第一步:导入依赖

第二步:编写服务端接口

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

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

第五步:编写客户端controller

第六步:编写客户端接口

第七步:演示

        介绍:接下来我会把学习阶段学到的框架等知识点进行整合,每一次整合是在前一章的基础上进行的,所以后面的整合不会重复放前面的代码。每次的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_18,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_16,color_FFFFFF,t_70,g_se,x_16​​

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

第一步:导入依赖 org.springframework.boot spring-boot-starter-web org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test io.springfox springfox-swagger2 2.9.2 io.springfox springfox-swagger-ui 2.9.2 com.github.xiaoymin swagger-bootstrap-ui 1.9.2 com.auth0 java-jwt 3.9.0 org.json json 20190722 com.baomidou mybatis-plus-boot-starter 3.2.0 com.baomidou mybatis-plus-generator 3.2.0 org.freemarker freemarker 2.3.28 com.alibaba fastjson 1.2.47 mysql mysql-connector-java 8.0.11 org.springframework.boot spring-boot-starter-data-redis 2.5.1 org.springframework.boot spring-boot-starter-aop 2.5.1 org.springframework.boot spring-boot-starter-web-services 2.5.1 org.apache.cxf cxf-rt-frontend-jaxws 3.1.6 org.apache.cxf cxf-rt-transports-http 3.1.6

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

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​​

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

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

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

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

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

第四步:编写服务端暴露接口的配置类 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() { return new ServletRegistrationBean(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​​

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

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

第五步:编写客户端controller

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

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类 * *

* History: * * * Date * Operator * Memo * * * 2021/8/25 17:51 * zrc * Create * * * * @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 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 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​​

特别注意:

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

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

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有