產生 JAX-WS 應用程式的 Java 構件

當從 JavaBeans 或 Enterprise Bean 元件啟動時,請使用 Java™ API for XML-Based Web Services (JAX-WS) 工具來產生 JAX-WS Web 服務應用程式所需的 JAX-WS 和 Java Architecture for XML Binding (JAXB) Java 構件。

開始之前

如果要開發 Java API for XML-Based Web Services (JAX-WS) Web 服務應用程式,您必須先開發明確或隱含說明 SEI 的服務端點介面 (SEI) 實作。

關於這項作業

當使用由下而上方法來開發 JAX-WS Web 服務時,請在現有的服務端點實作上使用 wsgen 指令行工具。 wsgen 工具會將已編譯的服務端點實作類別當作輸入來處理,並產生下列可攜式構件:
  • 配置及解除配置訊息內容所需的 Java Architecture for XML Binding (JAXB) 類別。
  • 如果指定選用的 -wsdl 引數,則為「Web 服務說明語言 (WSDL)」檔案。
支援的配置: z/OS® 平台不支援 wsimportwsgen schemagenxjc 指令行工具。 此功能由隨在 z/OS 平台上執行的 WebSphere® Application Server 提供的組合工具提供。 請閱讀 JAX-WS 應用程式的這些指令行工具以進一步瞭解這些工具。
最佳作法: WebSphere Application Server 提供 Java API for XML-Based Web Services (JAX-WS) 和 Java Architecture for XML Binding (JAXB) 工具。 wsimportwsgenschemagenxjc 指令行工具位於 WebSphere Application Server traditionalapp_server_root\bin\ 目錄中。 xjcschemagen 指令位於 Liberty 設定檔中的 app_server_root\jaxb\bin\ 目錄中。 在某些情況下, WebSphere Application Server 和 JDK 提供的工具所產生的構件支援相同層次的規格。 一般而言,JDK 工具所產生的構件可以在其他標準執行時期環境之間轉移。 不過,最佳作法是使用本產品隨附的工具,以在 WebSphere Application Server 環境內實現無縫整合,並利用 WebSphere Application Server中可能僅支援的特性。 如果要利用 JAX-WS 和 JAXB 2.2 版工具,請使用在 app_server_root\bin\ 目錄內之應用程式伺服器所提供的工具。

當您使用由下而上的方式 (從 JavaBeans開始) 來開發 JAX-WS Web 服務時,不需要開發 WSDL 檔。 使用註釋可提供配置服務端點或用戶端所需的所有 WSDL 資訊。 應用程式伺服器支援符合「Web 服務-交互作業能力 (WS-I) 基本設定檔 1.1 」規格且為「文件/文字」樣式文件或 RPC/Literal 樣式文件的 WSDL 1.1 文件。 此外,支援具有宣告 USE 屬性值 LITERAL 的連結的 WSDL 文件,但不支援值 ENCODED。 對於實作 document/literal 封套型樣的 WSDL 文件,在 XML 綱目中會宣告一個根元素,並利用它來作為訊息流程的作業封套。 要求和回應都有各自的封套元素定義。

為了確保 wsgen 指令不會遺漏服務端點實作 Bean 上的繼承方法,您必須將 @WebService 註釋新增至想要的超類別,或者您可以用超類別方法呼叫來置換實作類別中的繼承方法。

雖然在開發 JAX-WS 服務實作 Bean 時, WSDL 檔通常是選用的,但如果您使用 SOAP over JMS 傳輸來公開您的 JAX-WS 端點,且您要發佈 WSDL 檔,則這是必要的。 如果您要開發使用 SOAP over JMS 傳輸來呼叫的 Enterprise JavaBeans 服務實作 Bean ,且您想要發佈 WSDL ,使已發佈的 WSDL 檔包含完整解析的 JMS 端點 URL ,請讓 wsgen 工具指定 -wsdl 引數來產生 WSDL 檔。 在此實務範例中,您必須將 WSDL 檔與 Web 服務應用程式包裝在一起。

除了從指令行使用工具之外,您還可以從 Ant 建置環境內呼叫這些 JAX-WS 工具。 您可以從 Ant 建置環境內部使用 com.sun.tools.ws.ant.WsGen Ant 作業,呼叫 wsgen 工具。 為了讓功能正常運作,這項 Ant 作業需要您使用 ws_ant Script 來呼叫 Ant。

程序

  1. 尋找您的服務端點實作類別檔。
  2. 執行 wsgen 指令,以產生可攜式構件。
    wsgen 工具位於 app_server_root/bin/ 目錄中。
    [Windows]
    app_server_root\bin\wsgen.bat [options] service_implementation_class
    [Linux][AIX][HP-UX][Solaris]
    app_server_root/bin/ wsgen.sh [options] service_implementation_class
    [IBM i]
    app_server_root/bin/ wsgen [options] service_implementation_class
    (選用) 在 wsgen 指令中使用下列選項:
    • 請使用 -verbose 選項來查看產生的檔案清單,以及其他參考訊息。
    • 使用 -keep 選項來保留產生的 Java 檔。
    • 使用 -wsdl 選項來產生 WSDL 檔案。 如果您要開發將使用 HTTP 傳輸來呼叫的服務實作 Bean ,則 wsgen 指令行工具在此步驟期間所產生的 WSDL 檔是選用的。 不過,如果您要開發將使用 SOAP over JMS 傳輸來呼叫的服務實作 Bean ,則後續開發 JAX-WS 應用程式步驟中需要 wsgen 工具在此步驟期間產生的 WSDL 檔,因此它不是選用的。

    請閱讀 wsgen ,以進一步瞭解這個指令及您可以指定的其他選項。

結果

您具有建立 JAX-WS Web 服務所需的 Java 構件。

避免麻煩: wsgen 指令不會區分多個 XMLType 註釋之間的 XML 名稱空間,這些註釋在不同的 Java 套件內定義了相同的 @XMLType 名稱。 當此實務範例發生時,會產生下列錯誤:
錯誤: 兩個類別具有相同的 XML 類型名稱 ....
請使用 @XmlType.name 和 @XmlType.namespace 來指派不同的名稱給它們 ...
此錯誤指出您有類別或 @XMLType.name 值具有相同名稱,但存在於不同的 Java 套件中。 若要防止此錯誤,請新增 @XML.Type.namespace 類別新增至現有的 @XMLType 註釋,以區分 XML 類型。

當使用 JAX-WS 應用程式時, wsgen 指令行工具可能找不到共用類別檔。 您可以使用 com.ibm.websphere.webservices.WSDL_Generation_Extra_ClassPath 自訂內容來指定這些類別檔的位置。 如需相關資訊,請參閱 Java 虛擬機器自訂內容的相關說明文件。

範例

下列範例示範如何使用 wsgen 指令來處理服務端點實作類別,以產生 JAX-WS 構件。 這個範例 EchoService 服務實作類別使用明確的 JavaBeans 服務端點。
  1. 將範例 EchoServicePortTypeImpl 服務實作類別檔及相關聯的 EchoServicePortType 服務介面類別檔複製到目錄中。 目錄必須包含對應於類別檔的 com.ibm.was.wssample.echo 套件名稱的目錄樹狀結構。
    /* This is a sample EchoServicePortTypeImpl.java file.    */
    package com.ibm.was.wssample.echo;
    
    
    @javax.jws.WebService(serviceName = "EchoService", endpointInterface = 
    "com.ibm.was.wssample.echo.EchoServicePortType", 
    targetNamespace="http://com/ibm/was/wssample/echo/",
    portName="EchoServicePort")
    
    public class EchoServicePortTypeImpl implements EchoServicePortType {
    
    	public EchoServicePortTypeImpl() {
    	}
    
    	public String invoke(String obj) {
    		System.out.println(">> JAXB Provider Service: 
    Request received.\n");
    		String str = "Failed";
    		if (obj != null) {
    			try {
    				str = obj;
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    		return str;
    
    	}
    
    }	
    /* This is a sample EchoServicePortType.java file.    */
    package com.ibm.was.wssample.echo;
    
    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebResult;
    import javax.jws.WebService;
    import javax.xml.ws.RequestWrapper;
    import javax.xml.ws.ResponseWrapper;
    
    
    @WebService(name = "EchoServicePortType", targetNamespace = 
    "http://com/ibm/was/wssample/echo/", 
     wsdlLocation="WEB-INF/wsdl/Echo.wsdl")
    
    public interface EchoServicePortType {
    
    
        /**
         * 
         * @param arg0
         * @return
         *     returns java.lang.String
         */
        @WebMethod
        @WebResult(name = "response", targetNamespace = 
        "http://com/ibm/was/wssample/echo/")
        @RequestWrapper(localName = "invoke", targetNamespace = 
        "http://com/ibm/was/wssample/echo/", 
         className = "com.ibm.was.wssample.echo.Invoke")
        @ResponseWrapper(localName = "echoStringResponse", 
         targetNamespace = "http://com/ibm/was/wssample/echo/", 
         className = "com.ibm.was.wssample.echo.EchoStringResponse")
        public String invoke(
            @WebParam(name = "arg0", targetNamespace = 
            "http://com/ibm/was/wssample/echo/")
            String arg0);
    
    }
    
  2. app_server_root\bin\ 目錄執行 wsgen 指令。 -cp 選項指定服務實作類別檔的位置。 -s 選項指定產生的原始檔的目錄。 -d 選項指定所產生輸出檔的目錄。 使用 -s-d 選項時,您必須先為產生的輸出檔建立目錄。
    [Windows]
    app_server_root\bin\wsgen.bat -wsdl -s c:\generated_source\ -cp c:\my_application\classes\ 
    com.ibm.was.wssample.echo.EchoServicePortTypeImpl -verbose -d c:\generated_artifacts\
    [Linux][AIX][HP-UX][Solaris]執行 wsgen 指令; 例如:
    app_server_root/bin/wsgen.sh -wsdl -s c:/generated_source/ -cp c:/my_application/classes/ 
    com.ibm.was.wssample.echo.EchoServicePortTypeImpl -verbose -d c:/generated_artifacts/
使用 wsgen 指令產生 Java 構件之後,會產生下列檔案:
/generated_source/com/ibm/was/wssample/echo/EchoStringResponse.java
/generated_source/com/ibm/was/wssample/echo/Invoke.java
/generated_artifacts/EchoService.wsdl
/generated_artifacts/EchoService_schema1.xsd
/generated_artifacts/com/ibm/was/wssample/echo/EchoStringResponse.class
/generated_artifacts/com/ibm/was/wssample/echo/Invoke.class

EchoStringResponse.java 及 Invoke.java 檔案是產生的 Java 類別檔。 所產生 Java 檔案的已編譯版本為 EchoStringResponse.class 及 Invoke.class 檔案。 因為指定 -wsdl 選項,所以會產生 EchoService.wsdl 和 EchoService_schema1.xsd 檔案。

下一步

完成 JAX-WS Web 服務應用程式的實作。