下面将开始进行webservice的整合以及讲解如何编写作为服务端以及客户端如何请求。
首先展示一下我的目录结构:
我是在前面13章整合的代码上进行添加的,所以我会框选出新增部分代码。
服务端:
客户端:
目录结构展示完毕(事实上,为了方便,客户端的代码我是复制的服务端的代码,都是简单的Springboot项目,也可以自己新建),可以看到我将服务端的端口号设置的8089,客户端的端口号是8090。
<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注解。
到此,该服务端接口已经形成, 现在要做的就是将该接口暴露出来,所以新建一个配置类,如下:
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;
}
}
注意:不要引错包。
服务端的编写到此就结束了,特别简单。
客户端的调用就更简单了,我为了方便,直接把调用写在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类
*
* <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;
}
}
注意:不要引错包。
服务端接口地址的使用如上。
特别注意:服务端的接口,在客户端也需要建立相同的接口,如下:
特别注意:
由于前面已经整合了swagger,所以我直接启动客户端和服务端,然后打开客户端的在线swagger进行演示,如下:
从图中可以看到接口已经请求到了数据,但是从上面的客户端接口编写可以看到,其实我们并没有写该接口的具体业务,所以是调用的服务端的getCodes方法获取的数据,整合成功。
本期整合到此完毕,接下来会继续更新加强整合,尽情期待。
客户端访问地址:http://localhost:8090/swagger-ui.html或者http://localhost:8090/doc.html