Apache-CXF
简介
Apache CXF是一个开源的Services框架,CXF帮助您利用Frontend编程 API 来构建和开发Services,像JAX-WS、JAX-RS。这些Services可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP或者CORBA,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者JBI,CXF大大简化了 Services 的创建,同时它可以天然地和Spring进行无缝集成。
使用 CXF 创建 WebService 项目
搭建Web Services 服务端
1、引入依赖
<!-- 实现 CXF 对 Web Services 的自动配置 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.3.6</version>
</dependency>
2、配置CXF
@Configuration
public class CXFConfig {
//自定义
public static final String NAMESPACE_URI = "http://service.ws.cn";
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
@Bean
public Endpoint userServiceEndpoint(UserService userService) {
Endpoint endpoint = Endpoint.create(userService);
endpoint.publish("/user");//发布地址
return endpoint;
}
}
3、定义接口
@WebService(targetNamespace = CXFConfig.NAMESPACE_URI)
public interface UserService {
UserGetResponse get(UserGetRequest request);
UserCreateResponse create(UserCreateRequest request);
}
4、实现接口
@Service
@WebService(
serviceName = "userService", // 服务名称
targetNamespace = CXFConfig.NAMESPACE_URI // WSDL 命名空间)
public class UserServiceImpl implements UserService {
@Override
public UserGetResponse get(UserGetRequest request) {
UserGetResponse response = new UserGetResponse();
for (User user : myConstant.userList) {
if (request.getId().equals(user.getId())){
response.setId(request.getId());
response.setName(user.getName());
response.setGender(user.getGender());
break;
}
}
if (response.getName() == null){
response.setId(request.getId());
response.setName("无");
response.setGender(0);
}
return response;
}
@Override
public UserCreateResponse create(UserCreateRequest request) {
UserCreateResponse response = new UserCreateResponse();
Integer userId = Math.toIntExact(System.currentTimeMillis() / 1000);
response.setId(userId);
User user = new User();
user.setId(userId);
user.setName(request.getName());
user.setGender(request.getGender());
myConstant.userList.add(user);
return response;
}
}
5、启动服务,并访问http://127.0.0.1:9090/ws/user?wsdl 成功启动则返回如下界面
6、POSTMAN对服务端进行测试的结果
请求格式可以参考以下
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:lab="http://service.ws.cn">
<soapenv:Header/>
<soapenv:Body>
<lab:get>
<arg0>
<id>1599707331</id>
</arg0>
</lab:get>
</soapenv:Body>
</soapenv:Envelope>
搭建Web Services 客户端
1、引入依赖
<!-- 实现 CXF 对 Web Services 的自动配置 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.3.6</version>
</dependency>
<!-- cxf-codegen-plugin 插件,用于实现将 WSDL 生成目标类 -->
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>3.2.5</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<!-- WSDL 源文件地址 -->
<wsdlOptions>
<wsdlOption>
<wsdl>src/main/resources/wsdl/user.wsdl</wsdl>
<wsdlLocation>classpath:wsdl/user.wsdl</wsdlLocation>
</wsdlOption>
</wsdlOptions>
<!-- 生成 Java 代码目录 -->
<sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
2、使用cxf生成客户端代码
3、客户端编写代码对服务端进行调用
@GetMapping("/get")
public Map<String , Object> get(@RequestParam("id") Integer id) {
Map<String , Object> map = new HashMap<>();
UserGetRequest request = new UserGetRequest();
request.setId(id);
// 执行 Web Services 请求
UserGetResponse response = userService.get(request);
map.put("result", response);
return map;
}
@GetMapping("/create")
public Map<String , Object> create(@RequestParam("name") String name,
@RequestParam("gender") Integer gender) {
Map<String , Object> map = new HashMap<>();
// 请求
UserCreateRequest request = new UserCreateRequest();
request.setName(name);
request.setGender(gender);
// 执行 Web Services 请求
UserCreateResponse response = userService.create(request);
map.put("result", response);
return map;
}
4、客户端执行结果
postman请求一下接口
相关文章:
WebService笔记(一)基础概念和IDEA生成WebService