A. java cxf介面反應慢
webservice的服務端是cxf整合spring,已經可以正在發布
代碼如下
webservice介面:
package com.gary.test.ws.service;
import javax.jws.WebService;
@WebService
public interface GreetingService {
//傳遞字元串
public String greeting(String userName);
//傳遞javabean
public TestBean getBean();
}
webservice實現類:
package com.gary.test.ws.service.impl;
import java.util.Calendar;
import java.util.Date;
import javax.jws.WebService;
import com.gary.test.ws.service.GreetingService;
import com.gary.test.ws.service.TestBean;
@WebService(endpointInterface = "com.gary.test.ws.service.GreetingService")
public class GreetingServiceImpl implements GreetingService {
public String greeting(String userName) {
return "Hello " + userName + ", currentTime is "
+ Calendar.getInstance().getTime();
}
public TestBean getBean() {
TestBean tb = new TestBean();
tb.setProperty1("測試1");
tb.setProperty2(123);
tb.setProperty3(new Date());
return tb;
}
}
spring中配置
<jaxws:endpoint id="greetingService"
implementor="com.gary.test.ws.service.impl.GreetingServiceImpl"
address="getingService" >
</jaxws:endpoint>
B. java cxf動態調用服務端的webservices方法
WebService實現
1、 整個項目使用CXF來實現,在實現的過程中,在MyEclipse中對CXF下lib中的所有jar文件通過引入外部包來處理。
2、 在MyEclipse6.5中可以實現伺服器端和客戶端,但是客戶端在使用wsdl進行動態調用的過程中總是報錯,最後使用MyEclipse9.0實現了進行動態調用的實現。其中發生的錯誤如下:
(1)Exception in thread "main" java.lang.LinkageError: 正在從引導類載入器載入 JAXB 2.1 API, 但此 RI (來自jar:file:/D:/CXF/lib/jaxb-impl-2.2.5.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) 需要 2.2 API。請使用授權目錄機制將 jaxb-api.jar 放在引導類載入器中。(請參閱 http://java.sun.com/j2se/1.6.0/docs/guide/standards/)
解決辦法:
通過刪除引入包中的jaxb-impl-2.2.5.jar文件可以解決。
(2)java.lang.IllegalArgumentException: Can not set final com.sun.tools.internal.xjc.reader.internalizer.InternalizationLogic field
C. cxf中命令wsdl2java無法運行!
這個錯誤是報找不到jdk路徑,我之前是path全路徑配置的,也報這個錯誤,新建了一個JAVA_HOME,然後在path引用%JAVA_HOME%就可以找到了
D. 6、CXF與spring的整合(WebService的整合)
web.xml
說明: 這里主要配置了 spring 的配置文件地址, spring 監聽器、 CXF 核心控制器。
applicationContext.xml
說明:
在 spring 的配置文件中使用 jaxws:endpoint 元素來暴露 WebService ,這里有兩種方式:
然後我們就可以將工程部署到 tomcat 中,在瀏覽器中使用
地址 http://localhost:8080/cxf_spring/myService 訪問我們的 WebService 工程。
MyClient.java
注意: myService 指定我們的服務名字(在 web.xml 中配置),而 fkjava 指定服務提供者的地址(在 applicationContext.xml 中配置)。同時這種集成不好,因為將地址寫死了,沒有使用 spring 的注入方式。
我們看 HelloWorldWs.java 這個服務類:
可以看到其中的實際業務處理類還是使用的手工方法進行實例化,沒有使用 spring 的注入方式。
在 spring 的配置文件中改變暴露 WebService 的方式:
說明: 加 # 號是為了讓伺服器知道這個名字不是一個類 ,而只是一個 id 。
然後改造 HelloWorldWs.java 服務類:
然後我們再次使用之前的地址進行訪問,發現效果還是一樣的。
在上面配置的基礎上進行添加,在 applicationContext.xml 中:
此時,和以前一樣我們需要在客戶端(工程 Call_CXFSpring )那邊加上攔截器,添加上用戶名和密碼的頭,然後對伺服器進行訪問。以此來進行驗證。客戶端中我們運行類:
MyClient.java
訪問服務端。
傳統的 SSH 項目中,一般在本地是有相關的數據的,但是有一種場景是我們需要調用別人的數據,但是別人的數據不可能讓我們進行修改等操作,那麼別人只會暴露一個 WebService ,而我們就需要去調用別人的 WebService 伺服器。我們在訪問別人時,只能得到 WSDL 文檔。此時我們的項目中就不需要業務邏輯組件了,直接去調用別人的 WebService 的一個代理即可。
首先我們拷貝上面的工程,改名為 cxf_springClient ,然後需要增加 struts2 的相關 jar 包:
將原有的一些包刪掉,留下許可權包 org.fkjava.cxf.ws.auth 。然後我們啟動工程 Auth_Server 提供遠程服務。在 web 工程中生成相應的包及程序。
web.xml
說明: 這里我們不再需要 CXF 的 servlet 了,因為不需要業務類了,我們直接調用遠程業務即可。同時配置 struts2 的核心控制器。
applicationContext.xml
說明: 這里我們同樣不需要業務類了,但是需要配置遠程業務代理類( serviceClass )。同時注意:不要將埠設置為8080,會沖突。可以看到我們使用 serviceClass 將介面配置進去,而這里的 id 不能隨便寫,要和 action 中定義的介面名一致。由於遠程伺服器設置了許可權攔截,所以這里使用過濾器將用戶名和密碼設置到 wsdl 文檔的頭中。然後在這個類中我們需要使用 execute 方法去獲取相應的數據。
struts.xml
ListCatsAction .java
說明: 此時我們就可以使用地址 http://localhost:8080/cxf_springClient/listCats 進行訪問了,當然會報找不到 jsp 的錯誤。
content/listCats.jsp
說明: 此時訪問就可以看到
E. java web數據介面一般用什麼框架和技術來實現
開發webservice應用程序中離不開框架的支持,當open-open網站列舉的就有很多種,這對於開發者如何選擇帶來一定的疑惑。性能Webservice的關鍵要素,不同的框架性能上存在較大差異,而當前在官方網站、網路資料中可以方便的找到各自框架的介紹,但是很少有針對不同框架性能測試數據。本文選擇了比較流行幾個框架:
Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache Wink、Jboss RESTEasy、sun JAX-WS(最簡單、方便)、阿里巴巴 Dubbo(除外)等,採用Java作為測試用例,通過本機和遠程兩種進行測試方式,對這幾種框架進行了性能測試,並對測試結果分析和性能比較,最後並對性能優異的框架進行了推薦。
目前三種主流的web服務實現方法:
REST(新型):表象化狀態轉變 (軟體架構風格)RESTEasy、Wink、CXF、Axis2…….
SOAP(比較成熟):簡單對象訪問協議 Xfire、Axis2、CXF、Axis1
XML-RPC(淘汰):遠程過程調用協議(慢慢被soap 所取代)
REST 簡單易用,效率高,貌似未來有很大的發展空間,也有宣稱rest性能個方便比soap強大的,已經有很多框架宣稱對rest進行支持比如spring 3.0、struts…….. (網路觀點)
SOAP 成熟度較高,安全性較好
F. 如何使用CXF將 wsdl 文件變成java文件
用myeclipse將wsdl文件生成java代碼:
1、選擇新建的工程後,點擊右鍵,選擇「Run As」->「Run」,如下圖所示:
2、彈出如下窗口:
3、 在上圖中,左邊選擇「Java Application」後,點擊左上角的新增「」按鈕new configuration,頁面如下圖所示:
4、在上圖中,將「Include libraries when searching for a main class」 勾上,而後點擊「Main class」右邊的「Search」按鈕,彈出窗口如下圖所示:
5、在上圖中輸入WSDL2Java後,查找到axis這個jar包中對應類,點擊「OK」按鈕,此時主窗口如下圖所示:
6、在上圖中點擊「Arguments」頁簽,Arguments里把要生成的web service URI或wsdl文件寫進去,最後點run。在下圖中輸入的是wsdl文件的路徑: src/wsdl/acd_accessCode_interface.wsdl、src/wsdl/acd_accessCode_service.wsdl:
7、生成的java代碼如下:
G. springmvc框架如何實現像webservice一樣通過wsdl2Java生成客戶端代碼
在用到web service時,如果是調用自己開發的web service還好,可以有一個方法的介面或參數對象實體類什麼的,但如果是調用第三方的服務,除了得到web service服務地址的wsdl文檔外,沒有任何實質性編碼的東西,寫原生調用太麻煩,這時就需要自己寫一個方法的介面類。
這個,目前已經有比較成熟的工具,可以自動生成,下面作一下簡單的介紹。
apache的wsdl2java工具,目前貌似CXF和axis各有一套,使用方式大同小異,但生成的代碼會有所區別,這時說的是CXF提供的wsdl2java工具。
wsdl2java用法:
wsdl2java -p com -d src -all aa.wsdl
-p 指定其wsdl的命名空間,也就是要生成代碼的包名:
-d 指定要產生代碼所在目錄
-client 生成客戶端測試web service的代碼
-server 生成伺服器啟動web service的代碼
-impl 生成web service的實現代碼
-ant 生成build.xml文件
-all 生成所有開始端點代碼:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
詳細用法見:http://cwiki.apache.org/CXF20DOC/wsdl-to-java.html
一開始使用了CXF的這套工具,發現不是很方便,畢竟依賴CXF提供的工具jar包,個人不是很喜歡用。
後來發現JDK居然也自帶了對web service生成java代碼的功能,貌似1.6版本開始的,試用後發現效果十分不錯,果斷投入它的懷抱。下面作下簡單的介紹,以備忘。
打開jdk下的bin目錄 看下能否找到"wsimport.exe"這個文件
一般情況下都會有
如果沒有則說明你的JDK不支持這個功能
然後在DOS窗口下輸入wsimport 敲回車
如果提示錯誤的話 說明你的JDK環境變數還沒有配好
一句話總結,如果你在dos窗口下輸入wsimport正常,就可以
如果OK的話 輸入以下命令就可以將wsdl文件生成java文件了
wsimporthttp://127.0.0.1/TicketMobile/services/Cococ?wsdl -keep -p com.llg.ws2 -s g:/ws
參數說明
wsimport 這個是必須的 該工具的名稱
http://127.0.0.1/TicketMobile/services/Cococ?wsdl wsdl文件
-keep 是否生成源文件
-p com.llg.ws2 生成後的java包名
-s g:/ws 生成後放哪個目錄
但是前幾天,在對一個第三方提供的web service使用該工具生成java代碼的時候,居然出錯了,網上查找後終於找到原因。
使用cxf wsdl2java或javax wsimport工具的時候,可能會遇到關於生成的Response類文件名沖突的問題
Console代碼
WSDLToJavaError:ThrownbyJAXB:Aclass/interfacewiththesamename"***"isalreadyinuse..
目前可選擇的方案:
apache的wsdl2java工具,使用-autoNameResolution自動處理
wsdl2java -autoNameResolutionhttp://hello.joy2everyone.com/yourWebService?wsdl
JDK自帶的工具
wsimport -p com.test.client -keephttp://hello.joy2everyone.com/yourWebService?wsdl-B-XautoNameResolution
2.如果web service是己方開發的,可以修改代碼,使用自定義bindings,詳細可看sun webservice文檔
例如:
Java代碼
@WebMethod
@WebResult(name="response")
(@WebParam(name="request")ValidateCCRequestrequest);
這個情況下定義的方法名,如果使用工具生成客戶端代碼,很可能存在Response沖突,因為定義的wsdl中會有一個關於介面方法的message
<wsdl:message name="validateCCResponse">
</wsdl:message>
方法名定義的message與介面定義返回的ValidateCCResponse,在工具生成客戶端代碼時就會產生命名沖突。
但是通過更改介面方法名為:
Java代碼
@WebMethod
@WebResult(name="response")
(@WebParam(name="request")ValidateCCRequestrequest);
即可解決該沖突,
H. CXF解析svcwsdl文件成java格式
1.安裝JDK1.5,配置系統環境變數:
下載安裝JDK後,設置環境變數:
JAVA_HOME=C:/ProgramFiles/Java/jdk1.5.0_02
Path=%Path%;%JAVA_HOME%/bin(這里的%Path%指你系統已經有的一系列配置)
CLASSPATH=%JAVA_HOME%/lib
2.下載CXF,配置系統環境變數:
CXF下載地址http://cxf.apache.org/download.html
配置環境變數:
CXF_HOME=E:WebServiceCXFapache-cxf-2.1.1apache-cxf-2.1.1(以我的目錄為例)
PATH後追加上「;%CXF_HOME%in」
在cmd命令行中輸入wsdl2java如果顯示其用法表示配置好了。
3.運行命令是:wsdl2javad:documentwebservicehello.wsdl(wsdl的路徑)
4.如果沒有報錯就表示執行成功了,但是執行成功後的java文件生成到什麼地方了?系統沒有提示,當時我就用了一種最笨的方法來找,在整個電腦裡面搜索才找到的,後來我才發現了規律,就是你敲入命令的時候,所處的路徑,肯定就是你文件生成的地方,我當時是cmd直接進入的,
路徑是C:,所以生成的文件也在這個目錄下。
5.新建工程,將生成的java文件和所需要的jar包導入即可。
參考地址:
http://radio123.iteye.com/blog/1134267