產生 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 Architecture for XML Binding (JAXB) 類別。
- 如果指定選用的 -wsdl 引數,則為「Web 服務說明語言 (WSDL)」檔案。
當您使用由下而上的方式 (從 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。
程序
結果
您具有建立 JAX-WS Web 服務所需的 Java 構件。
錯誤: 兩個類別具有相同的 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 虛擬機器自訂內容的相關說明文件。
範例
- 將範例
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); } - 從 app_server_root\bin\ 目錄執行 wsgen 指令。
-cp選項指定服務實作類別檔的位置。-s選項指定產生的原始檔的目錄。-d選項指定所產生輸出檔的目錄。 使用-s或-d選項時,您必須先為產生的輸出檔建立目錄。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\執行 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/
/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 服務應用程式的實作。