# SpringBootWebservice
**Repository Path**: dhq/SpringBootWebservice
## Basic Information
- **Project Name**: SpringBootWebservice
- **Description**: springBoot+Webservice
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 7
- **Created**: 2020-04-07
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SpringBootWebservice
## 1. WebService是什么
准确的来说,webservice 不是一种技术,而是一种规范。是一种跨平台,跨语言的规范,用于不同平台,不同语言开发的应用之间的交互。 举个例子,比如在 Windows Server 服务器上有个 C# .Net 开发的应用 A,在 Linux 上有个 Java 语言开发的应用 B,现在 B 应用要调用 A 应用,或者是互相调用,用于查看对方的业务数据,就可以使用 webservice 的规范。
再举个例子,天气预报接口。无数的应用需要获取天气预报信息,这些应用可能是各种平台,各种技术实现,而气象局的项目,估计也就一两种,要对外提供天气预报信息,这个时候,如何解决呢?webservice 就是出于以上类似需求而定义出来的规范。
我们一般是在具体平台开发 webservice 接口,以及调用 webservice 接口,每种开发语言都有自己的 webservice 实现框架。比如 Java 就有 Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache Wink、Jboss RESTEasyd 等等。其中 Apache CXF 用的比较多,它也可以和 Spring Boot 整合。
## 2. 项目介绍
本项目是 Spring Boot 和 Webservice 的整合案例,可以直接下载到本地运行,实际项目可以由本案例进行扩展。本项目的相关环境和配置如下:
* JDK版本:1.8
* Spring Boot 版本:1.5.6.RELEASE
* Apache CXF:3.1.12
* Hutool:4.0.9
## 3. 项目运行
* 1、通过git或者svn下载本项目。
* 2、通过eclipse或者idea打开本项目,下载相关的mvn依赖,配置字符集utf-8。
* 3、运行项目,打开浏览器输入地址:`http://localhost:9999/services`,可以看到暴露出来的 webservice 服务。
* 4、点击其中的链接,进入 wsdl 文件,可以看到其中的方法协议。
* 5、打开项目的 test 目录,找到 com.lli 中的 CxfClient 测试类。我们可以看到其中有两个调用方法,`cl1()` 和 `cl2()`,`cl1()` 方法是静态调用方式调用 webservice 接口,`cl2()` 是动态调用。
## 4. Spring Boot 和 webservice 的整合过程
### 4.1 Spring Boot cxf 依赖
Spring Boot 和 CXF 整合非常简单,只需要一个依赖即可,如下:
```xml
org.apache.cxf
cxf-spring-boot-starter-jaxws
3.1.11
```
可以看出,Spring Boot 已经集成了 cxf 所需要的相关依赖,我们不用再分别引入 cxf 对应的依赖了。可以点开 `cxf-spring-boot-starter-jaxws` 看一下:
```xml
org.apache.cxf
cxf-spring-boot-autoconfigure
${project.version}
org.apache.cxf
cxf-rt-transports-http
${project.version}
org.apache.cxf
cxf-rt-frontend-jaxws
${project.version}
```
可以看出,已经包含了 cxf 所需要的相关依赖了。
### 4.2 服务端接口定义
```java
@WebService(name = "CommonService", // 暴露服务名称
targetNamespace = "http://webservice.lli.com/"// 命名空间,一般是接口的包名倒序
)
public interface CommonService {
@WebMethod
String sayHello(@WebParam(name = "param") String param);
@WebMethod
String getUser(@WebParam(name = "param") String param);
}
```
创建一个接口,定义两个接口方法,分别用来返回不同的信息,实际中根据具体需求来定义接口方法以及参数。这里有几个注解解释一下:
> `@WebService` 注解:表明该接口是个 WebService 服务,name 属性用来定义该 webservice 服务名称; targetNamespace 属性用来定义命名空间。
> `@WebMethod` 注解:表明接口中的方法是用来提供具体的服务的。
### 4.3 服务端接口的实现
```java
@WebService(serviceName = "CommonService", // 与接口中指定的name一致
targetNamespace = "http://webservice.lli.com/", // 与接口中的命名空间一致,一般是接口的包名倒
endpointInterface = "com.lli.webservice.CommonService"// 接口地址
)
@Component
public class CommonServiceImpl implements CommonService {
@Override
public String getUser(String param) {
User user = new User("1", "吹比龙", "18");
return user.toString();
}
}
```
其中 `@WebService` 注解中的 `endpointInterface` 属性用来定义服务的地址,这个地址和下面的 cxf 配置中要对应,下面再说明。
### 4.4 cxf 服务配置
```java
@Configuration
public class CxfConfig {
@Autowired
private Bus bus;
@Autowired
CommonService commonService;
/** JAX-WS **/
@Bean
public Endpoint endpoint2() {
EndpointImpl endpoint = new EndpointImpl(bus, commonService);
endpoint.publish("/CommonService");
return endpoint;
}
}
```
这里的配置是将上面刚刚定义的 `CommonService` 接口发布到了 `/services/CommonService` 路径下,wsdl 文档路径为 `http://localhost:9999/services/CommonService?wsdl`。
### 4.5 cxf client客户端
这里使用动态调用为例,代理的方式请看源码。
```java
public class CxfClient {
public static void main(String[] args) throws Exception {
cl2();
}
/**
* 动态调用方式
* @throws Exception
*/
public static void cl2() throws Exception {
// 创建动态客户端
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf
.createClient("http://localhost:9999/services/CommonService?wsdl");
// getUser 为接口中定义的方法名称 张三为传递的参数 返回一个Object数组
Object[] objects = client.invoke("getUser", "张三");
System.out.println(objects[0]);
}
}
```
注意事项:如果在同一个工程中,上面的 localhost 需要修改成本机的 ip 地址,否则会创建 cxf client 失败。运行一下 client,如果控制台打印出如下信息表示 webservice 服务启动成功:
```
User{userId='1', username='吹比龙', age='18'}
```
至此,Spring Boot 集成 Werbservice 完成。如果你觉得对你有帮助,不妨请作者喝杯咖啡~