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.csdn.net/qq_44424498/article/details/104839399
這裏是在java項目中使用cxf發佈webservice項目
pom文件,記住如果架包沒有導好,很有可能會發布項目包錯,版本不能太高
這裏是2.4.2的版本,或者可以去這篇博客中看看https://blog.csdn.net/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服務是一樣的,沒有變化