如何根據WSDL文檔開發部署Web Service服務?java
WSDL文檔是描述Web Service接口該如何開發和部署的具體描述文檔,十分重要。一個接口的WSDL文檔裏會包含接口部署時的服務名(service name),接口的綁定信息,綁定端口信息和接口方法中的參數信息等。根據這些信息,咱們能夠經過WSDL文檔反向自動創建接口的java代碼結構,提升開發工做效率。web
下面介紹一下使用WSDL文檔反向自動創建接口的java代碼結構的步驟。apache
1、新建Dynamic Web Project 項目。api
2、在項目中添加已有的WSDL文檔。瀏覽器
WSDL文檔直接放在項目根目錄下。tomcat
WSDL文檔內容說明:session
3、根據該WSDL反向生成接口java代碼結構。app
1、在項目上右鍵,進入新建web service配置窗口。webapp
2、選擇Web Service,Next。ide
3、配置web service
包括建立web service用哪一種類型、選擇一個wsdl文檔、配置tomcat和web service運行環境以及service所在項目、webservice處於哪一個進度(選develop階段)。
其中service implementations選擇咱們在步驟(三.1)中導入的wsdl文件。
Web service type選項欄中有兩個可選項,分別是 Bottom up Java bean Web Service和Top down Java bean Web Service。前者表示根據已有的JAVA文件生成WSDL文檔和web service服務,後者表示根據已有的WSDL文檔反向生成web service服務的JAVA代碼結構。
在這裏,咱們選擇後者。
4、接下來就都是next,最後finish。web service代碼結構已經生成了。
接下來的工做,就是在IfAPServiceSoapBindingImpl.java文件中編寫咱們的業務邏輯代碼,能夠另外建立其餘package包,合理安排代碼模塊。
4、web service的業務代碼編寫完以後,開始發佈。
1、新建發佈文件server-config.wsdd。
自動發佈的方法,就是在項目的WEB-INF路徑下新建一個server-config.wsdd發佈文件。這個文件的大部份內容能夠來源於模板(模板內容稍後貼出),只有<service>...</service>部分填寫剛寫好的web service的發佈部署信息。這部分信息在自動生成的deploy.wsdd中已經有了,咱們能夠直接拿過來,複製到server-config.wsdd中。
注:server-config.wsdd的基本內容以下:
<?xml version="1.0"encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="adminPassword" value=XXXX" />
<parameter name="p_w_uploads.Directory" value="D:\Tomcat\temp\axis\WEB-INF\p_w_uploads"/>
<parameter name="p_w_uploads.implementation"
value="org.apache.axis.p_w_uploads.AttachmentsImpl"/>
<parameter name="sendXsiTypes" value="true" />
<parameter name="sendMultiRefs" value="true" />
<parameter name="sendXMLDeclaration" value="true" />
<parameter name="axis.sendMinimizedElements" value="true" />
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session"/>
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request"/>
<parameter name="extension" value=".jwr"/>
</handler>
</requestFlow>
</globalConfiguration>
<handler name="LocalResponder"
type="java:org.apache.axis.transport.local.LocalResponder"/>
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
<handler name="Authenticate"
type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
<service name="AdminService" provider="java:MSG">
<parameter name="allowedMethods" value="AdminService" />
<parameter name="enableRemoteAdmin" value="false" />
<parameter name="className" value="org.apache.axis.utils.Admin"/>
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
</service>
<!-- <service name="Version"provider="java:RPC"> -->
<!-- <parameter name="allowedMethods"value="getVersion" /> -->
<!-- <parameter name="className"value="org.apache.axis.Version" /> -->
<!-- </service> -->
<!--myself webservice-->
<service name="IfAPService" provider="java:RPC" style="rpc"use="encoded">
<parameter name="wsdlTargetNamespace" value="http://eaaapi.eaa.eidc.huawei.com/"/>
<parameter name="wsdlServiceElement" value="IfAPService"/>
<parameter name="wsdlServicePort" value="IfAPService"/>
<parameter name="className" value="com.huawei.eidc.eaa.eaaapi.IfAPServiceSoapBindingSkeleton"/>
<parameter name="wsdlPortType" value="APService"/>
<parameter name="typeMappingVersion" value="1.2"/>
<parameter name="allowedMethods" value="*"/>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper" />
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
</requestFlow>
<parameter name="qs:list"
value="org.apache.axis.transport.http.QSListHandler"/>
<parameter name="qs.list"
value="org.apache.axis.transport.http.QSListHandler"/>
<parameter name="qs:method"
value="org.apache.axis.transport.http.QSMethodHandler"/>
<parameter name="qs.method"
value="org.apache.axis.transport.http.QSMethodHandler"/>
<parameter name="qs:wsdl"
value="org.apache.axis.transport.http.QSWSDLHandler"/>
<parameter name="qs.wsdl"
value="org.apache.axis.transport.http.QSWSDLHandler"/>
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder" />
</responseFlow>
</transport>
</deployment>
2、發佈web service。
在上述步驟以後,咱們能夠發佈接口項目了。只須要將項目打包成war文件,並將war包放到指定的tomcat的webapps路徑下,啓動tomcat。這裏咱們把打包的包名設爲webTest.war
3、查看發佈的web service是否成功。
在瀏覽器中輸入: http://localhost:8080/webTest/services
(注意不要在」services」後面加斜槓‘/ ’),獲得下面的結果,可知web service發佈成功。
5、測試代碼
import java.io.IOException;
import javax.xml.namespace.QName;
import model.Utility;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.http.params.CoreConnectionPNames;
/**模擬ADC向SI發送數據請求*/
public class ADC2SI {
private static String test_url = "http://172.0.0.1:8080/webTest/services/IfAPService";
//調用SI接口,發送post請求
public static void main(String[] args) throws HttpException, IOException{
String str = "params";
postmethod2(test_url,str);
}
public static void postmethod2(String url, String str) throws HttpException, IOException{
// 使用RPC方式調用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定調用WebService的URL
EndpointReference targetEPR = new EndpointReference(url);
options.setTo(targetEPR);
// 指定要調用的sayHelloToPerson方法及WSDL文件的命名空間
QName opAddEntry = new QName("http://eaaapi.eaa.eidc.huawei.com","corpBinding");
// 指定sayHelloToPerson方法的參數值
Object[] opAddEntryArgs = new Object[] { str };
// 指定sayHelloToPerson方法返回值的數據類型的Class對象
@SuppressWarnings("rawtypes")
Class[] classes = new Class[] { String.class };
// 調用sayHelloToPerson方法並輸出該方法的返回值
try{
System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0]);
System.out.println("發送數據 SUCCESS");
}catch(Exception e){
System.out.println("發送數據 FAILED");}}