日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Spring和CXF整合發(fā)布WebService(服務(wù)端、客戶端)最詳細(xì)

 一本正經(jīng)地胡鬧 2019-08-21

目錄

一、服務(wù)端

1、依賴

1.1 第一種方式

1.2 第二種方式

2、測試代碼

3、配置文件

3.1 第一種配置方式

3.2 第二種配置方式

4、運(yùn)行

二、生成客戶端

第一種方式wsdl2java

第二種方式 wsimport

三、測試


工作上遇到了,所以自己琢磨了一下,也是第一次想到用博客來記錄,平時(shí)也有用word文檔記錄,怕忘了。所以在這里來一個(gè)詳細(xì)總結(jié),那些關(guān)于WebService和CXF什么的我這里就不多說了,那些網(wǎng)上一搜一大把,就直接上干貨。

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

一、服務(wù)端

建立Maven項(xiàng)目,引入依賴

1、依賴

1.1 第一種方式

直接在pom文件里添加依賴。

  1. <dependency>
  2. <groupId>org.apache.cxf</groupId>
  3. <artifactId>cxf-core</artifactId>
  4. <version>3.1.4</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.cxf</groupId>
  8. <artifactId>cxf-rt-transports-http</artifactId>
  9. <version>3.1.4</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.cxf</groupId>
  13. <artifactId>cxf-rt-frontend-jaxws</artifactId>
  14. <version>3.1.4</version>
  15. </dependency>

CXF只需添加這三個(gè)jar包的依賴,Maven會(huì)自動(dòng)引入幫我們引入其他jar包。在pom文件里添加完成后保存,就會(huì)觸發(fā)Maven自動(dòng)去下載你添加的依賴jar包(如果你本地倉庫有就直接是取的本地倉庫的) ,然后項(xiàng)目目錄下就會(huì)有Maven Dependencies,如下圖,是添加完成后的。

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

1.2 第二種方式

把下載的二進(jìn)制文件解壓縮到一個(gè)目錄,然后配置環(huán)境變量:

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

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

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

apache-cxf二進(jìn)制文件下載地址:http://cxf./download.html

下載箭頭所指的那個(gè):

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

在項(xiàng)目上右鍵,Build Path / Configure Build Path / Add library / CXF Runtime,然后選擇apache-cxf,點(diǎn)擊Finish就好了,你的項(xiàng)目目錄下就會(huì)多出一個(gè)Apache CXF Library,其他的就跟下面一樣了。

不過這種方法在運(yùn)行的時(shí)候可能會(huì)隔段時(shí)間就會(huì)報(bào)錯(cuò),但是服務(wù)還是能正常運(yùn)行,下面是報(bào)錯(cuò)信息:

  1. DefaultValidationEventHandler: [ERROR]: prefix wsdp is not bound to a namespace
  2. Location: node: [wsd:Types: null]javax.xml.bind.UnmarshalException: prefix wsdp is not bound to a namespace- with linked exception:
  3. [java.lang.IllegalArgumentException: prefix wsdp is not bound to a namespace]
  4. at

到網(wǎng)上搜索報(bào)錯(cuò)原因,是因?yàn)閘ib目錄下有多余jar包導(dǎo)致的,解決方案是把多余的jar包刪除。

  1. cxf-services-ws-discovery-api-3.1.4.jar
  2. services-ws-discovery-service-3.1.4.jar
  3. services-wsn-api-3.1.4.jar
  4. services-wsn-core-3.1.4.jar
  5. manifest.jar

其中,MANIFEST.MF文件在這個(gè)目錄下..\apache-cxf-3.2.5\samples\jax_rs\minimal_osgi\src\main\resources\META-INF。

2、測試代碼

創(chuàng)建一個(gè)接口,記得加上@WebService注解,表示你要“暴露”的接口(服務(wù)類)。

  1. @WebService
  2. public interface HelloService {
  3. public String sayHello(String name) ;
  4. }

實(shí)現(xiàn)類:

  1. //實(shí)現(xiàn)類上可以不添加@Webservice注解
  2. public class HelloServiceImp implements HelloService {
  3. @Override
  4. public String sayHello(String name) {
  5. return "大家好,我是"+name;
  6. }
  7. }

3、配置文件

配置方式的話也有兩種,先來看下第一種方式。

3.1 第一種配置方式

spring.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www./schema/beans"
  3. xmlns:xsi="http://www./2001/XMLSchema-instance"
  4. xmlns:context="http://www./schema/context"
  5. xsi:schemaLocation="http://www./schema/beans
  6. http://www./schema/beans/spring-beans-3.0.xsd
  7. http://www./schema/context
  8. http://www./schema/context/spring-context-3.0.xsd">
  9. <import resource="spring-cxf.xml" />
  10. </beans>

spring-cxf.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www./schema/beans"
  3. xmlns:xsi="http://www./2001/XMLSchema-instance"
  4. xmlns:context="http://www./schema/context"
  5. xmlns:jaxws="http://cxf./jaxws" <!-- 別忘記添加命名空間 -->
  6. xsi:schemaLocation="http://www./schema/beans
  7. http://www./schema/beans/spring-beans-3.0.xsd
  8. http://www./schema/context
  9. http://www./schema/context/spring-context-3.0.xsd
  10. http://cxf./jaxws
  11. http://cxf./schemas/jaxws.xsd">
  12. <!--其中id是自己定義的,implementor是接口實(shí)現(xiàn)類,address就是訪問的地址 -->
  13. <!-- 相當(dāng)于Endpoint.publish("http://localhost:8080/service", newHelloServiceImp()); -->
  14. <jaxws:endpoint id="helloService" implementor="com.eastcom.ws.impl.HelloServiceImp" address="/hello"/>
  15. </beans>

 

3.2 第二種配置方式

spring.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www./schema/beans"
  3. xmlns:xsi="http://www./2001/XMLSchema-instance"
  4. xmlns:context="http://www./schema/context"
  5. xsi:schemaLocation="http://www./schema/beans
  6. http://www./schema/beans/spring-beans-3.0.xsd
  7. http://www./schema/context
  8. http://www./schema/context/spring-context-3.0.xsd">
  9. <bean id="HelloService" class="com.eastcom.ws.impl.HelloServiceImp">
  10. <import resource="spring-cxf.xml" />
  11. </beans>

spring-cxf.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www./schema/beans"
  3. xmlns:xsi="http://www./2001/XMLSchema-instance"
  4. xmlns:context="http://www./schema/context"
  5. xmlns:jaxws="http://cxf./jaxws" <!-- 別忘記添加命名空間 -->
  6. xsi:schemaLocation="http://www./schema/beans
  7. http://www./schema/beans/spring-beans-3.0.xsd
  8. http://www./schema/context
  9. http://www./schema/context/spring-context-3.0.xsd
  10. http://cxf./jaxws
  11. http://cxf./schemas/jaxws.xsd">
  12. <!-- implementor屬性里寫的是bean的id,但是要以#開頭,特定寫法 -->
  13. <jaxws:endpoint implementor="#HelloService" address="/hello"/>
  14. </beans>

補(bǔ)充:

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

  1. <import resource="classpath:META-INF/cxf/cxf.xml" />
  2. <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

2、關(guān)于spring-cxf.xml中另一種配置方式(這種方式我沒嘗試,有興趣的下伙伴可以自己去試下)。

  1. <!--相當(dāng)于:JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); -->
  2. <jaxws:server address="/hello" serviceClass="com.eastcom.ws.impl.HelloServiceImp">
  3. <!-- 配置消息攔截器 -->
  4. <jaxws:inInterceptors>
  5. <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
  6. </jaxws:inInterceptors>
  7. <jaxws:outInterceptors>
  8. <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
  9. </jaxws:outInterceptors>
  10. </jaxws:server>

上面配置完了,該到web.xml文件里配置了。

  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>classpath:spring.xml</param-value>
  4. </context-param>
  5. <listener>
  6. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  7. </listener>
  8. <servlet>
  9. <servlet-name>cxf</servlet-name>
  10. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  11. <load-on-startup>1</load-on-startup>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>cxf</servlet-name>
  15. <url-pattern>/service/*</url-pattern>
  16. </servlet-mapping>

4、運(yùn)行

配置完了以后,部署到Tomcat上運(yùn)行,右鍵run as/run on server/Finish,Eclipse彈出下圖所示界面表示服務(wù)已經(jīng)成功發(fā)布,如果彈出404或者報(bào)錯(cuò),就是發(fā)布失敗。當(dāng)然也可以到瀏覽器里面看運(yùn)行效果,地址是:http://localhost:8080/項(xiàng)目名/service 。點(diǎn)擊箭頭所指的地方就能看到wsdl文件。(不要在意我這里的項(xiàng)目名)

二、生成客戶端

第一種方式wsdl2java

CXF提供的根據(jù)wsdl生成客戶端代碼的命令。

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

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

注意中間的空格?。?!

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

-d 指定要產(chǎn)生代碼所在目錄

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

代碼生成后如圖:

第二種方式 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

同樣注意中間的空格!?。?/p>

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

三、測試

代碼

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

結(jié)果

第一次寫,也當(dāng)做一次學(xué)習(xí)經(jīng)歷,以上就是我自己總結(jié)的內(nèi)容,中間有我遇到的問題,以及解決方案,有引用到別人的經(jīng)驗(yàn)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多