中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現Spring和CXF整合發布WebService

發布時間:2021-09-29 15:38:13 來源:億速云 閱讀:107 作者:iii 欄目:大數據

本篇內容主要講解“如何實現Spring和CXF整合發布WebService”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何實現Spring和CXF整合發布WebService”吧!

這里自己琢磨出兩種方式,一種是引入依賴,另一種是下載apache-cxf的二進制文件解壓縮,在eclipse里配置好,這樣就不要引入依賴了,在apache-cxf/lib目錄下有所有關于CXF的jar包和Spring相關的jar包,可以自己下載以后去看,如果還需引入其他jar包,另外在pom中添加依賴,下載后記得配置環境變量,先說第一種。

一、服務端
建立Maven項目,引入依賴

1、依賴
1.1 第一種方式
直接在pom文件里添加依賴。

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-core</artifactId>
    <version>3.1.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>3.1.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.1.4</version>
</dependency>
CXF只需添加這三個jar包的依賴,Maven會自動引入幫我們引入其他jar包。在pom文件里添加完成后保存,就會觸發Maven自動去下載你添加的依賴jar包(如果你本地倉庫有就直接是取的本地倉庫的) ,然后項目目錄下就會有Maven Dependencies,如下圖,是添加完成后的。

如何實現Spring和CXF整合發布WebService

在pom文件中我只添加了三個依賴jar包,其他這么多jar包就是Maven自動為我添加的。和spring整合發布webservice還要加入spring的依賴jar包,這個就自己去添加了,第一種就說完了。

1.2 第二種方式
把下載的二進制文件解壓縮到一個目錄,然后配置環境變量:

1、變量名:CXF_HOME    值:apache-cxf的解壓縮路徑,示例:E:\Install software\apache-cxf-3.2.5

2、在path后面加上 %CXF_HOME%/bin;

在cmd命令中輸入wsdl2java,如果有提示usage,就表明配置成功。

apache-cxf二進制文件下載地址:http://cxf.apache.org/download.html

下載箭頭所指的那個:

如何實現Spring和CXF整合發布WebService

再就是建立項目,不過不需要引入依賴了,只要在eclipse里配置了,如圖:

如何實現Spring和CXF整合發布WebService

在項目上右鍵,Build Path / Configure Build Path / Add library / CXF Runtime,然后選擇apache-cxf,點擊Finish就好了,你的項目目錄下就會多出一個Apache CXF Library,其他的就跟下面一樣了。

不過這種方法在運行的時候可能會隔段時間就會報錯,但是服務還是能正常運行,下面是報錯信息:

DefaultValidationEventHandler: [ERROR]: prefix wsdp is not bound to a namespace 
Location:  node: [wsd:Types: null]javax.xml.bind.UnmarshalException: prefix wsdp is not bound to a namespace- with linked exception:
[java.lang.IllegalArgumentException: prefix wsdp is not bound to a namespace]
at 
到網上搜索報錯原因,是因為lib目錄下有多余jar包導致的,解決方案是把多余的jar包刪除。

cxf-services-ws-discovery-api-3.1.4.jar
services-ws-discovery-service-3.1.4.jar
services-wsn-api-3.1.4.jar
services-wsn-core-3.1.4.jar
manifest.jar
其中,MANIFEST.MF文件在這個目錄下..\apache-cxf-3.2.5\samples\jax_rs\minimal_osgi\src\main\resources\META-INF。

2、測試代碼
創建一個接口,記得加上@WebService注解,表示你要“暴露”的接口(服務類)。

@WebService
public interface HelloService {
    
    public String sayHello(String name) ;
    
}
實現類:

//實現類上可以不添加@Webservice注解  
public class HelloServiceImp implements HelloService {
 
    @Override
    public String sayHello(String name) {
        return "大家好,我是"+name;
    }
}
3、配置文件
配置方式的話也有兩種,先來看下第一種方式。

3.1 第一種配置方式
spring.xml

<?xml version="1.0"> <beans xmlns="http://www.springframework.org/schema/beans"  
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"  
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
                    http://www.springframework.org/schema/context   
                    http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
 
    <import resource="spring-cxf.xml" />  
  
</beans>
spring-cxf.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"  
  xmlns:jaxws="http://cxf.apache.org/jaxws" <!-- 別忘記添加命名空間 -->
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
                    http://www.springframework.org/schema/context   
                    http://www.springframework.org/schema/context/spring-context-3.0.xsd
                    http://cxf.apache.org/jaxws  
                    http://cxf.apache.org/schemas/jaxws.xsd">  
     
     <!--其中id是自己定義的,implementor是接口實現類,address就是訪問的地址 -->
     <!-- 相當于Endpoint.publish("http://localhost:8080/service", newHelloServiceImp()); -->
 
     <jaxws:endpoint id="helloService" implementor="com.eastcom.ws.impl.HelloServiceImp" address="/hello"/>
  
</beans>
 
 

3.2 第二種配置方式
spring.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"  
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
                    http://www.springframework.org/schema/context   
                    http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
 
    <bean id="HelloService" class="com.eastcom.ws.impl.HelloServiceImp">
    <import resource="spring-cxf.xml" />  
</beans>
spring-cxf.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"  
  xmlns:jaxws="http://cxf.apache.org/jaxws" <!-- 別忘記添加命名空間 -->
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
                    http://www.springframework.org/schema/context   
                    http://www.springframework.org/schema/context/spring-context-3.0.xsd
                    http://cxf.apache.org/jaxws  
                    http://cxf.apache.org/schemas/jaxws.xsd"> 
 
    <!-- implementor屬性里寫的是bean的id,但是要以#開頭,特定寫法 -->
     <jaxws:endpoint implementor="#HelloService" address="/hello"/>
  
</beans>
補充:

1、至于以前還需引入的 cxf.xml 和 cxf-servlet.xml,網上說是cxf3.0以后就不需要了,至于為什么,原因在這里。

<import resource="classpath:META-INF/cxf/cxf.xml" />  
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
2、關于spring-cxf.xml中另一種配置方式(這種方式我沒嘗試,有興趣的下伙伴可以自己去試下)。

<!--相當于:JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();   -->
<jaxws:server address="/hello" serviceClass="com.eastcom.ws.impl.HelloServiceImp">  
    <!-- 配置消息攔截器 -->
    <jaxws:inInterceptors>  
        <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>  
    </jaxws:inInterceptors>  
    <jaxws:outInterceptors>  
        <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>  
    </jaxws:outInterceptors>  
</jaxws:server>
上面配置完了,該到web.xml文件里配置了。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
    <servlet-name>cxf</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>cxf</servlet-name>
    <url-pattern>/service/*</url-pattern>
</servlet-mapping>
4、運行
配置完了以后,部署到Tomcat上運行,右鍵run as/run on server/Finish,Eclipse彈出下圖所示界面表示服務已經成功發布,如果彈出404或者報錯,就是發布失敗。當然也可以到瀏覽器里面看運行效果,地址是:http://localhost:8080/項目名/service 。點擊箭頭所指的地方就能看到wsdl文件。(不要在意我這里的項目名)

如何實現Spring和CXF整合發布WebService

如何實現Spring和CXF整合發布WebService

二、生成客戶端
第一種方式wsdl2java
CXF提供的根據wsdl生成客戶端代碼的命令。

在cmd命令中輸入:wsdl2java -d 指定代碼生成目錄 -client webservice的訪問地址url或者本地的wsdl文件目錄地址

示例:wsdl2java -d E:\\AllWorkSpace\\MyWork\\TheClient\\src -client http://localhost:8080/Dom4j_AxisDemo/service/hello?wsdl

注意中間的空格!!!

具體用法自行百度,這里只對上面的用法做解釋:

-d 指定要產生代碼所在目錄

-client 生成客戶端測試web service的代碼

代碼生成后如圖:

如何實現Spring和CXF整合發布WebService

第二種方式 wsimport
JDK提供的生成客戶端的命令。

在cmd命令中輸入:wsimport -s 指定代碼生成目錄 -p 包名 -keep webservice訪問地址url

示例:wsimport -s E:\\AllWorkSpace\\MyWork\\TheClient\\src -p com.eastcom.ws.client -keep http://localhost:8080/Dom4j_AxisDemo/service/hello?wsdl

同樣注意中間的空格!!!

目錄地址中不能含有空格,發布地址不要忘了?wsdl

如何實現Spring和CXF整合發布WebService

三、測試
代碼,如果生成客戶端的時候wsdl你是用的文件地址目錄,那就不能這樣直接new出來了,在構造方法里要傳服務的地址,具體可以到自己生成的server類里去查看。

public class TestService {
    public static void main(String[] args) {
        HelloService service=new HelloServiceImpService().getHelloServiceImpPort();
        System.out.println(service.sayHello("CXF"));
    }
}

結果

如何實現Spring和CXF整合發布WebService


 

到此,相信大家對“如何實現Spring和CXF整合發布WebService”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

婺源县| 繁峙县| 榆树市| 孝感市| 全椒县| 米泉市| 台北县| 太康县| 鄂伦春自治旗| 保亭| 黔江区| 张北县| 大邑县| 南开区| 广州市| 延川县| 陈巴尔虎旗| 敦煌市| 多伦县| 胶州市| 宁化县| 甘孜县| 雷波县| 惠来县| 小金县| 达州市| 德昌县| 蒙山县| 石城县| 衢州市| 吉林省| 奇台县| 湘阴县| 交口县| 隆尧县| 天祝| 彝良县| 东方市| 阿坝县| 饶阳县| 中西区|