CXF框架介绍
1、什么是CXF
Apache CXF = Celtix + Xfire
2、CXF的优势
(1)支持多种协议:
* SOAP1.1,1.2
* HTTP
* CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构,早期语言使用的WS。C,c++,C#)
(2)并可以与Spring进行快速无缝的整合
(3)灵活的部署:可以运行有Tomcat,Jboss,Jetty(内置),IBMWS,BeaWS上面。
配置cxf的环境变量:https://blog.youkuaiyun.com/qq_44424498/article/details/104839399
这里是在java项目中使用cxf发布webservice项目
pom文件,记住如果架包没有导好,很有可能会发布项目包错,版本不能太高
这里是2.4.2的版本,或者可以去这篇博客中看看https://blog.youkuaiyun.com/qiaodaima0/article/details/100765613?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.21.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
项目里添加cxf的支持
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>2.4.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
第一步:编写服务接口
@WebService
public interface HelloWorld {
public String sayHello(@WebParam(name="name")String name);
public void addUser(@WebParam(name="user")Users user);
public @WebResult(name="javaList")List<Users> getUserList();
}
第二步:编写接口实现类
public class HelloWorldImpl implements HelloWorld {
private List<Users> userList = new ArrayList<Users>();
@Override
public String sayHello(String name) {
return "hello "+name;
}
@Override
public void addUser(Users user) {
userList.add(user);
}
@Override
public List<Users> getUserList() {
return userList;
}
}
第三步:使用JaxWsServerFactoryBean来发布服务
public class HelloWorldApp {
public static void main(String[] args) {
// 创建服务工厂对象
JaxWsServerFactoryBean sfb = new JaxWsServerFactoryBean();
// 设置服务地址
sfb.setAddress("http://127.0.0.1:8888/hello");
// 设置服务类
sfb.setServiceClass(HelloWorldImpl.class);
// 设置服务对象的实例
sfb.setServiceBean(new HelloWorldImpl());
// 发布服务
sfb.create();
}
}
到这里项目就发布好了,现在就要生成wsdl文件,还是在cmd中
第一步:使用CXF里的wsdl2java来生成客户端代码
wsdl2java -d . http://127.0.0.1:8888/hello?wsdl
第二步: 将生成的客户端代码拷贝到客户端项目里
第三步:调用
public class TestHelloServer {
public static void main(String[] args) {
//和发布基本一致
// 创建服务工厂代理对象
JaxWsProxyFactoryBean svr = new JaxWsProxyFactoryBean();
//设置服务响应类,需要接口类型
svr.setServiceClass(HelloWorld.class);
//设置服务地址
svr.setAddress("http://127.0.0.1:8888/hello");
//将创建的服务类返回并强转
HelloWorld hw = (HelloWorld) svr.create();
//使用webservice
Users user = new Users();
user.setId(1);
user.setName("张三");
hw.addUser(user);
System.out.println(hw.sayHello("李四"));
List<Users> list = hw.getUserList();
for(Users u:list){
System.out.println(u.getName());
}
}
}
现在是spring的集成
CXF和spring boot整合发布webservice服务
pom.xml支持
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.21.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xr</groupId>
<artifactId>cxf-spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cxf-spring</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.12</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.12</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.1.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
第一步:创建服务接口和接口实现类和上面的一样
第二步:编写WebServiceConfig.java进行配置
@Configuration
public class WebServiceConfig {
@Bean
public ServletRegistrationBean dispatcherServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/service/*");//发布服务名称
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
@Bean
public UsersService userService() {
return new UsersServiceImpl();
}
@Bean
public Endpoint endpoint() {
//import org.apache.cxf.jaxws.EndpointImpl;不要导错包了
EndpointImpl endpoint = new EndpointImpl(springBus(), userService());//绑定要发布的服务
endpoint.publish("/user"); //显示要发布的名称
return endpoint;
}
}
最后:查看生成的wsdl
在浏览器上输入http://localhost:8080/service,点击进去就可以看到生成的wsdl了
客户端调用webservice服务是一样的,没有变化