使用CXF發佈webService服務和spring的集成

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服務是一樣的,沒有變化

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章