來自: http://www.ibm.com/developerworks/cn/webservices/ws-axisfaq/
1 引言
隨著Web服務技術的發展和成熟,其方便性和易用性已逐漸被人們所接受,越來越多的合作伙伴之間開始利用Web服務來實現合作方之間的數據接口。使用Apache Axis和Linux平臺是一種低成本的Web服務解決方案,但Apache Axis文檔的FAQ對開發者來說內容還不夠豐富,本文作者將自己使用Axis時遇到的問題和解決方法整理成文,奉獻給Web服務的開發人員和對此感興趣的讀者朋友,旨在幫助大家節約一些寶貴的時間。有關Web服務的基礎知識,讀者可以閱讀參考文獻中推薦的文檔。作者未在文中介紹Apache和Resin的安裝方法,讀者可以參考相關網站的說明文檔。
作者使用的軟件環境如下。
操作系統:Red Hat Linux 7.2
Web服務器: Apache 1.3.27
應用服務器:Resin 2.1.8 ( http://www.caucho.com/ )
SOAP服務器:Apache Axis 1.1
XML解析器:Xerces 2.5.0,Xalan 2.5.1
JDK版本:JDK 1.4.1
2 使用Axis時的常見問題及其解決方法
2.1 Axis運行需要哪些jar文件
對Axis解包后,將axis-1_1/webapps/axis/WEB-INF/lib/目錄下的jar文件復制到/usr/local/apache/htdocs/WEB-INF/lib目錄下(Web應用程序的目錄)。應包括以下jar文件。
axis-ant.jar
axis.jar
commons-discovery.jar
commons-logging.jar
jaxrpc.jar
log4j-1.2.8.jar
name.txt
saaj.jar
wsdl4j.jar
|
如果需要使用axis提供的測試頁面,還要將axis-1_1/webapps/axis/目錄下的文件復制到/usr/local/apache/htdocs/axis/目錄下。應包括以下募?
EchoHeaders.jws
fingerprint.jsp
happyaxis.jsp
index.html
|
2.2 應該使用哪一種XML解析器
XML解析器選用不當,經常會導致使用Apache Axis時出現一些莫名其妙的問題。
由于Apache Axis 并未對Resin內置的xml解析器進行過測試,因此推薦讀者使用已通過測試的Xerces xml解析器??梢詮?http://xml.apache.org/xalan-j/index.html 處下載Xalan的Java版XSLT處理器,其中包含了Xerces的Java版XML解析器,不需要再單獨下載xml解析器。
Xalan 2.5.1解包后,將bin/目錄下的xercesImpl.jar、xml-apis.jar和xalan.jar復制到resin安裝目錄的lib/目錄下,例如/usr/local/resin/lib。
編輯/etc/目錄下的profile文件,找到設置CLASSPATH環境變量的位置,在其后加入下面的內容(B shell)。
XMLPARSER=$RESIN_HOME/lib/xalan.jar:$RESIN_HOME/lib/xercesImpl.jar:$RESIN_HOME/lib/xml-apis.jar
export CLASSPATH=$XMLPARSER:$CLASSPATH
|
2.2.1 注意事項
如果CLASSPATH中包含其它的XML解析器設置,應將其從CLASSPATH環境變量的設置中去掉,以免發生沖突。
2.3 如何在Resin中使用Xerces的XML解析器
通過修改resin.conf將resin的XmlParser置換為Xerces的XmlParser。在resin.conf對應的Web應用程序配置中加入以下設置。
<system-property javax.xml.transform.TransformerFactory="org.apache.xalan.processor.TransformerFactoryImpl"/>
<system-property javax.xml.parsers.DocumentBuilderFactory="org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"/>
<system-property javax.xml.parsers.SAXParserFactory="org.apache.xerces.jaxp.SAXParserFactoryImpl"/>
<system-property org.xml.sax.driver="org.apache.xerces.parsers.SAXParser"/>
|
配置完成后重新啟動Resin。
2.4 如何排除XML解析器出現的異常
2.4.1 問題描述
使用http://test.com/axis查看已部署的服務時出現Axis內部錯,顯示有關WSDD配置的異常信息。如果把WEB-INF目錄下的server-config.wsdd刪除,再查看就正常了,但只能看到AdminService和Version兩個系統缺省的服務,后來部署的服務都看不到了。
2.4.2 原因分析
Axis會在WEB應用程序的WEB-INF/目錄下自動生成一個名字為server-config.wsdd的xml文件,其中記錄了已部署的WEB服務。每部署一個新的WEB服務時,Axis都會將新服務的描述信息加入到server-config.wsdd中。
故障站點使用的XmlParser是resin內置的XmlParser,Axis并未對其對進行過兼容性測試,查看WEB服務信息時需要從server-config.wsdd(這是一個xml文件)取得已部署的WEB服務描述信息,當server-config.wsdd的內容較復雜時,resin內置的XmlParser因某種原因出現異常,導致Axis內部錯誤。Server-config.wsdd中記錄的Web服務描述信息較少時不會出現異常。
2.4.3 解決方法
修改resin.conf,將resin的XmlParser置換為Xerces的XmlParser。置換方法參見2.3節。
2.4.4 小結
如果Axis報告的錯誤中有關于xml解析器的錯誤,建議讀者參照本小節描述的方法更換應用服務器的xml解析器,將會有助于問題的解決。
2.5 如何將Axis集成到Resin或其它應用服務器
Axis是以Servlet的方式運行的,而Resin的作用相當于Servlets容器(Container),因此只要配置得當,就可以使Axis在Resin環境中運行,這一點也適用于Resin以外的其它應用服務器。在Resin中配置Axis的方法如下。
將axis-1_1/webapps/axis/WEB-INF/web.xml中的Servlet配置項復制到resin.conf中對應的Web應用程序配置中。通常應包括以下內容。
<!-- Axis Web-Service Configuration Start -->
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<display-name>Axis Admin Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AdminServlet
</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<servlet-name>SOAPMonitorService</servlet-name>
<display-name>SOAPMonitorService</display-name>
<servlet-class>
org.apache.axis.monitor.SOAPMonitorService
</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5001</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/axis/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>
<!-- uncomment this if you want the admin servlet -->
<!--
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/axis/servlet/AdminServlet</url-pattern>
</servlet-mapping>
-->
<!-- currently the W3C havent settled on a media type for WSDL;
http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
for now we go with the basic 'it's XML' response -->
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<!-- Axis Web-Service Configuration End -->
|
2.6 Axis提供了哪些開發工具
Apache Axis提供了WSDL2Java和Java2WSDL兩個開發工具。
WSDL2Java利用已知的WSDL文件生成服務端和客戶端代碼。該WSDL文件可以是由合作伙伴提供的,也可以是利用Java2WSDL生成的。Java2WSDL根據已有的Java類文件生成WSDL文件,Java類文件可以是接口類文件,并不需要實現細節。
此外Axis還提供了SoapMonitorApplet和TCPMon工具,可用于監測Web服務。
2.7 如何生成Web服務的服務端和客戶端代碼
2.7.1 生成或取得WSDL文件
Java2WSDL是Axis提供的利用Java類文件得到WSDL文件的工具。類文件可以使用接口文件編譯生成,例如下面的接口文件SoftwarePrice.java。
package samples.userguide.example6;
/**
* Interface describing a web service to set and get software prices.
**/
public interface SoftwarePrice {
public void setWidgetPrice(String softWareName, String price);
public String getWidgetPrice(String softWareName);
|
編譯SoftwarePrice.java。
將SoftwarePrice.class復制到正確的package路徑下。
執行下面的命令:
java org.apache.axis.wsdl.Java2WSDL -o sp.wsdl -l"http://test.com:80/services/SoftwarePrice" -n "urn:SoftwarePrice"
-p"samples.userguide.example6" "urn:Example6" samples.userguide.example6.SoftwarePrice
|
各參數的含義如下。
-o:指定輸出的WSDL文件的文件名。
-l:指定服務的位置。
-n:WSDL文件的目標名字空間。
-p:指定從package到名字空間的映射,這里可以有多個映射。
|
最后面的類文件包含了Web服務的接口。
該命令執行后,將生成sp.wsdl文件。
如果按CLASSPATH的設置找不到指定的類文件,Axis將報告異常,如下所示。
java.lang.ClassNotFoundException: samples.userguide.example6.SoftwarePrice
at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
at java.security.AccessController.doPrivileged(Native Method)
……
|
如果出現上面的問題,請檢查是否已將有關類文件復制到正確的位置或CLASSPATH設置是否正確。
生成WSDL文件以后,就可以利用Axis提供的WSDL2Java工具生成Web服務的服務端代碼和客戶端代碼了。
2.7.1.1 注意事項
WSDL文件也可以由合作伙伴提供。這種情況下合作伙伴往往是Web服務的提供者或標準接口的制定者,開發者只要按照既定的WSDL文件生成客戶端或服務端代碼就可以了。
2.7.2 生成客戶端或服務端代碼
WSDL2Java工具用于從WSDL文件生成客戶端存根(stub)代碼,服務端框架(skeleton)代碼以及WSDL中的數據類型文件(生成與之對應的Java代碼)。開發人員只需向框架代碼中補充相關的業務邏輯代碼即可得到完整的Web服務代碼,因此該工具極大地減輕了開發人員的編碼負擔。WSDL2Java的使用舉例如下。
java org.apache.axis.wsdl.WSDL2Java --server-side --skeletonDeploy true MyService.wsdl
|
執行上述命令后將生成下列文件。
No. |
文件 |
用途 |
1. |
deploy.wsdd |
MyService服務的部署描述文件 |
2. |
MyService.java |
MyService服務的接口文件 |
3. |
MyServiceService.java |
獲得MyService服務的接口文件 |
4. |
MyServiceServiceLocator.java |
實現MyServiceService接口 |
5. |
MyServiceSoapBindingImpl.java |
實現MyService接口,應向其中補充業務邏輯 |
6. |
MyServiceSoapBindingSkeleton.java |
MyService服務的服務端框架代碼,實現MyService, org.apache.axis.wsdl.Skeleton接口 |
7. |
MyServiceSoapBindingStub.java |
MyService服務的客戶端存根代碼,實現MyService接口 |
8. |
undeploy.wsdd |
注銷MyService服務的部署描述文件 |
2.7.3 編寫Web服務客戶端代碼
Web服務的客戶端程序完成對Web服務的調用,其程序結構如下。
import com.chinavnet.zx.service.v1_0.*;// WSDL2Java生成的package的名字空間;
public class TestClient {
public static void main (String[] args) throws Exception
{
com.chinavnet.zx.service.v1_0.SPInterfaceForVNetLocator locator = new SPInterfaceForVNetLocator();//獲得一個locator對象
locator.setMaintainSession(true);
com.chinavnet.zx.service.v1_0.SPInterfaceForVNetSoap service = locator.getSPInterfaceForVNetSoap();//獲得服務對象
com.chinavnet.zx.service.v1_0.DetailLedgerFeedbackResult feedbackRes = null;
//初始化Web服務中定義的數據類型
try {
feedbackRes = service.generalLedgerFeedback();//調用Web服務的方法并取得返回值
System.out.println("FeedbackResult :");
if(feedbackRes != null)
{
System.out.println("SPID: " +feedbackRes.getSPID());
System.out.println("errorDesc: " +feedbackRes.getErrorDescription());
System.out.println("result: " +feedbackRes.getResult());
}else
{
System.out.println("feedbackRes is null!");
}
} catch (java.rmi.RemoteException re) {
// throw new junit.framework.AssertionFailedError("Remote Exception caught: " + re );
re.printStackTrace();
}
}//End of main()
}//End of TestClient class
|
測試客戶端程序是非常簡單的,將客戶端程序編譯后,執行"java TestClient"即可。
2.8 如何編寫服務端代碼
向MyServiceSoapBindingImpl.java添加相關的業務邏輯代碼后,將WSDL2Java生成的源程序編譯,打包成jar文件,復制到/usr/local/apache/htdocs/WEB-INF/lib/目錄下。
2.9 如何發布Web服務
有了deploy.wsdd文件并準備好類文件后,就可以發布MyService服務了。Axis在安裝后自動發布了AdminService,利用它可以發布新的Web服務。方法如下。
java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
上面的命令執行后,有如下提示。
Processing file deploy.wsdd
<Admin>Done processing</Admin>
|
2.10 執行WSDL2Java時報告" 類型被引用但未定義"
2.10.1 問題描述
執行WSDL2Java時報告下面的異常:
java.io.IOException: Type {http://schemas.xmlsoap.org/wsdl/} ArrayOfFailedRecord is referenced but not defined.
|
2.10.2 原因分析
出現上述情況可能的原因有:
類型未定義就被引用。
使用了錯誤的名字空間。
WSDL文件中存在輸入錯誤。
2.10.3 解決方法
經過仔細檢查發現wsdl文件中的
<s:element minOccurs="0" maxOccurs="1" name="FailedRecords" type="s0:ArrayOfFailedRecord" />
|
的type=" s0:ArrayOfFailedRecord"中的s0:前面有一個空格,將空格刪除后問題解決了。
2.10.4 小結
WSDL文件中出現的編輯錯誤有可能導致執行WSDL2Java時出現"類型被引用但未定義"錯誤。
2.11 server-config.wsdd的作用是什么
server-config.wsdd記錄了axis已發布的Web服務的描述信息。
2.12 發布Web服務時報告"Exception:: (404)Not Found"
2.12.1 問題描述
執行java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd命令發布WEB服務時報告如下內容。
Processing file deploy.wsdd
Exception:: (404)Not Found
|
Apache的access_log顯示如下。
127.0.0.1 - - [17/Sep/2003:15:56:33 +0800] "POST /services/AdminService HTTP/1.0" 404 293
|
2.12.2 原因分析
出現這個問題的比較簡單的原因可能是端口不對,或URL路徑不對(例如路徑中多寫了目錄),Axis的SoapMonitor服務按指定的端口或URL找不到AdminService,需要檢查正確的端口號和URL路徑。
比較深層次的原因就復雜得多了。
本文作者遇到的是下面的情況。
AdminService是一個已發布的WEB服務。
AdminClient使用soap協議同AdminService通信,需要按指定的端口和URL定位AdminService,而原來使用的resin.conf中,有兩個web-app配置項,配置A的摘要如下所示。
<host id=' '>
<app-dir>/usr/local/apache/htdocs/</app-dir>
|
配置B的摘要如下所示。
<host id='test.com'>
<app-dir>/usr/local/apache/htdocs/esales/</app-dir>
|
Axis的有關配置在配置B中。
Httpd.conf中的DocumentRoot是/usr/local/apache/htdocs/。
使用java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd發布WEB服務時,需要按http協議解析url: //localhost:80/services/AdminService。由于htdocs/目錄下并沒有services/目錄(services是Axis在resin.conf中的servlet-mapping),因此應用服務器按resin.conf中的配置去定位AdminService ,因為url的主機名為localhost,因此resin不會到<host id='test.com'>(配置B)中去定位url,而是到配置A中去定位,在配置A中并沒有Axis的配置,找不到與AdminService相關的url,因此報告了前面描述的異常情況。
2.12.3 解決方法
知道了原因后,按如下方法就可以解決了。
將配置B中全部關于Axis的配置移到配置A中,注意相應地要改變/etc/profile中的CLASSPATH變量的值。
保存resin.conf后,重新登錄服務器(使新的CLASSPATH生效),重新啟動resin。再次發布WEB服務。
java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
|
屏幕顯示如下。
Processing file deploy.wsdd
<Admin>Done processing</Admin>
|
WEB服務終于發布成功了。
在發布成功的情況下apache的access_log中會看到如下的log:
tail -f access_log|grep vice
127.0.0.1 - - [17/Sep/2003:16:05:00 +0800] "POST /services/AdminService HTTP/1.0" 200 296 "-" "Axis/1.1"
|
2.12.4 小結
本小節描述的問題可能是讀者遇到的出現最多的異常,但原因并不是唯一的。遇到該問題時,建議讀者冷靜分析出現問題的可能原因,多實驗幾種解決方法,最終一定可以成功!
2.13 如何監測SOAP請求和響應流
2.13.1 引言
發布了Web服務以后,如何觀察請求和響應數據呢?記錄運行日志是一種傳統且有效的方法,但對于調試程序來講還不夠方便和直觀。值得欣慰的是,Axis為我們提供了在客戶端觀察SOAP請求和響應流數據的工具SoapMonitor,經過適當配置后,可以實時地觀察到Web服務的SOAP請求和響應數據。SoapMonitor是一個Java Applet程序,通過瀏覽器下載到客戶端運行。下面就介紹SoapMonitor的配置和使用方法。
2.13.2 準備SOAPMonitor 小應用程序
在Axis 1.1中,沒有為我們編譯SOAPMonitor.java程序,但我們可以在axis-1_1/webapps/axis/目錄下找到名字為SOAPMonitorApplet.java的源程序文件,自己進行編譯。該程序編譯后,會生成如下的類文件:
SOAPMonitorApplet.class
SOAPMonitorApplet$ServiceFilterPanel.class
SOAPMonitorApplet$SOAPMonitorData.class
SOAPMonitorApplet$SOAPMonitorFilter.class
SOAPMonitorApplet$SOAPMonitorPage.class
SOAPMonitorApplet$SOAPMonitorTableModel.class
SOAPMonitorApplet$SOAPMonitorTextArea.class
|
讀者需要把上述類文件復制到自己的Web應用程序目錄下,本例中是/usr/local/apache/htdocs/目錄。
在瀏覽器地址樣中輸入SOAPMonitor的地址,例如 http://test.com/SOAPMonitor ,瀏覽器會提示用戶正在下載Applet程序,下載完畢后,讀者可以在瀏覽器窗口中看到如圖4-1所示的用戶界面。如果上述類文件的位置不正確,瀏覽器會報告"找不到類"的錯誤。此時應檢查是否已將上述類文件復制到正確的目錄下。
圖 2-1 SOAPMonitor的界面
2.13.3 發布SOAPMonitor服務
圖2-1所示的SOAPMonitor界面出現后,并不意味著就可以觀察到Web服務的SOAP請求流與響應流了,首先需要發布SOAPMonitorService。該Web服務是由Axis提供的,但需要由用戶自己進行發布,方法如下。
獲得SOAPMonitor服務的WSDD文件deploy.wsdd,內容如下(也可到 http://www.sosnoski.com/presents/java-xml/axis/axis-monitor.html 復制該文件):
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<handler name="soapmonitor"
type="java:org.apache.axis.handlers.SOAPMonitorHandler">
<parameter name="wsdlURL"
value="/axis/SOAPMonitorService-impl.wsdl"/>
<parameter name="namespace"
value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
<parameter name="serviceName" value="SOAPMonitorService"/>
<parameter name="portName" value="Demo"/>
</handler>
<service name="SOAPMonitorService" provider="java:RPC">
<parameter name="allowedMethods" value="publishMessage"/>
<parameter name="className"
value="org.apache.axis.monitor.SOAPMonitorService"/>
<parameter name="scope" value="Application"/>
</service>
</deployment>
|
發布SOAPMonitor服務:
java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
|
2.13.4 修改deploy.wsdd
發布SOAPMonitor服務后,還要對被監測的Web服務進行配置。方法是先注銷該Web服務,然后修改該服務對應的WSDD文件,在其中增加請求流和響應流的配置,否則是觀測不到SOAP請求和響應流的。
注銷Web服務的方法如下。
進入該Web服務的undeploy.wsdd文件所在的目錄,執行
Java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService undeploy.wsdd
|
修改WSDD文件的方法如下。
以Axis提供的MyService為例,對MyService的WSDD文件做如下修改。
修改前:
...
<service name="MyService" provider="java:RPC">
<parameter name="className" value="samples.userguide.example3.MyService"/>
<parameter name="allowedMethods" value="*"/>
...
|
修改后: (有下劃線的行是新加入的內容)
...
<service name="MyService" provider="java:RPC">
<requestFlow>
<handler type="soapmonitor"/>
</requestFlow>
<responseFlow>
<handler type="soapmonitor"/>
</responseFlow>
<parameter name="className" value="samples.userguide.example3.MyService"/>
<parameter name="allowedMethods" value="*"/>
...
|
修改WSDD文件后,重新發布MyService服務:
java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
|
2.13.5 啟動SOAPMonitor小應用程序
按2.13.2節介紹的方法啟動SOAPMonitor小應用程序。
使用客戶端程序測試MyService服務:
# java samples.userguide.example3.Client -lhttp://vnet.sohu.com/services/MyService "test"
結果為:You typed : test
|
注意,一定要先啟動SOAPMonitor小應用程序,后調用Web服務才能觀察到SOAP請求和響應流。
2.13.6 觀察SOAP請求和響應流
這時在SoapMonitorApplet的窗口中可以觀察到SOAP和請求和響應消息,如圖2-2所示。
圖2-2 MyService的Soap請求和響應流
2.14 使用客戶端程序測試Web服務時報告"Exception:: (404)Not Found"
2.14.1 問題描述
WEB服務接口編寫完成并發布后,客戶端測試程序收不到WEB服務的返回結果,Apache或Resin的log中也看不到訪問記錄。但測試程序返回結果為0(成功),在沒有部署該WEB服務的情況下,也是這個結果,因此懷疑調用的是WSDL文件的提供者自己測試用的WEB服務接口,可能與另一方提供的WSDL文件有關。
2.14.2 原因分析
合作伙伴調用WEB服務就能夠成功,從WEB服務主機自己的客戶端調用就接收不到數據,估計與合作伙伴提供的WSDL文件有關,該WSDL文件影響了WSDL2Java生成的客戶端stub代碼。檢查stub代碼,發現其soapAction都指向了合作伙伴的測試地址。
2.14.3 解決方法
修改stub代碼中的soapAction,改為sp(Service Provider)自己的WEB服務URL。重新編譯程序并發布Web服務,問題解決。
_call.setSOAPActionURI("sp自己的Web服務地址");
2.14.4 小結
本小節描述的問題出現于Web服務提供方按合作伙伴統一提供的WSDL文件生成客戶端代碼的情況。遇到這類問題,讀者可直接檢查WSDL2Java自動生成的代碼的有關部分。
在WSDL文件中可以看到與下列內容相似的設置。
<wsdl:service name="SPInterfaceForVNet">
<wsdl:port binding="impl:SPInterfaceSoapSoapBinding" name="SPInterfaceForVNetSoap">
<wsdlsoap:address location="http://test.com/services/SPInterfaceSoap" />
</wsdl:port>
</wsdl:service>
|
其中 http://test.com/services/SPInterfaceSoap即為已發布的WEB服務的URL,供客戶端調用。
2.15 如何列出已發布的Web服務
使用下面的命令:
java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/ list
|
實際上該命令的輸出就是server-config.wsdd文件的內容。
2.16 發布Web服務時報告"調用目標異常"
2.16.1 問題描述
在部署WEB服務時報告:java.lang.reflect.InvocationTargetException異常。
2.16.2 原因分析
在WSDL文件中自定義的名字空間與Axis的services名字空間沖突。
2.16.3 解決方法
修改WSDL文件,將services改為別的名字。
2.17 WSDL文件中的targetNamespace的作用是什么
TargetNamespace指明目標名字空間,用于驗證xml文檔。
在WSDL文件中,<definitions>中的targetNamespace與<types>中的targetNamespace應保持一致。
2.18 Web服務部署成功但檢測不到
2.19 客戶端程序找不到可用的Web服務
2.19.1 問題描述
執行
java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
|
時顯示<Admin>Done processing</Admin>,卻檢查不到新的服務,在WEB-INF/目錄下的server-config.wsdd文件中也看不到相應的配置項。
2.19.2 原因分析
新的WEB服務的類文件沒有重新編譯并復制到正確的位置。
2.19.3 解決方法
WEB服務的類文件可以打包為jar文件。在CLASSPATH環境變量中正確設置jar文件的路徑。例如:
jar cvf SPInterfaceSoap.jar com/zx/service/v1_0/*.class
|
將SPInterfaceSoap.jar復制到WEB-INF/lib/目錄下,重新發布WEB服務。
2.20 如何排除原因不明的錯誤
有時,在對WEB服務執行客戶端測試時會出現慕名其妙的錯誤。為保證環境是正確的,可以按下面的步驟排除原因不明的錯誤。
1. Undeploy被測試的服務
java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService undeploy.wsdd
|
2. 重新啟動resin: /usr/local/resin/bin/httpd.sh restart(如果是其它的應用服務器,請按相應的方法重新啟動)
3. 重新發布WEB服務
4. 進行測試
3 小結
目前有很多可以使用的應用服務器和Web服務平臺軟件,本文僅以Apache Axis和Resin為例介紹了在部署Web服務的過程中可能遇到的問題及其解決方法,其中并未討論Web服務的安全性問題。對于如何高效地開發和部署Web服務以及如何確保Web服務的安全性,還希望對此感興趣的讀者共同參與討論,對于文中存在的錯誤和不足之處也希望讀者朋友們能夠不吝批評指正。
參考資料
關于作者
 |
|
 |
姓名:劉紅濤 電子郵件: redwaveht@hotmail.com 辦公電話:+86(010)87717788轉5645 移動電話:13910662615 專長:電子郵件系統,計費系統,Radius協議,Web服務。 興趣:J2EE 研究方向:Web服務和數據挖掘
|