Implementierungsdeskriptoren für einen JAX-WS-Client entwickeln

Implementierungsdeskriptoren sind Standardtextdateien im XML-Format, die in eine Web-Service-Anwendung gepackt werden. Optional können Sie den Implementierungsdeskriptor für Servicereferenzen, der in der Spezifikation Web Services for Java™ Platform, Enterprise Edition (Java EE) (JSR 109) definiert ist, verwenden, um Anwendungsmetadaten zu erweitern und zu überschreiben, die in Annotationen in JAX-WS-Web-Service-Clients (Java API for XML-Based Web Services) angegeben sind.

Vorbereitende Schritte

Zuerst müssen Sie mit dem Befehl wsimport die Web-Service-Clientartefakte aus einer WSDL-Datei (Web Services Description Language) generieren.

Informationen zu diesem Vorgang

Sie können service-ref-Einträge in den Java-EE-Implementierungsdeskriptoren application-client.xml, web.xml und ejb-jar.xml hinzufügen. Ein service-ref-Eintrag stellt eine Referenz auf einen Web-Service dar, der von einer Java-EE-Komponente in Web-, EJB- (Enterprise JavaBeans) oder Anwendungs-Client-Containern verwendet wird. Ein service-ref-Eintrag hat einen JNDI-Namen, der zum Suchen des Service verwendet wird. Wenn Sie den service-ref-Eintrag angeben, können die Clientanwendungen den Service über eine JNDI-Lookup-Operation suchen. Außerdem können Sie diese Servicereferenzen für die Ressourceninjektion verwenden.

Für jeden in einem der Implementierungsdeskriptoren gefundenen service-ref-Eintrag wird das entsprechende Serviceobjekt an den JNDI-Namespace gebunden, und die Portinformationen werden, sofern vorhanden, eingefügt. Der JAX-WS-Client kann jetzt eine JNDI-Lookup-Operation durchführen, um einen JAX-WS-Service oder eine Portinstanz abzurufen.

Wenn Sie ein Element service-ref definieren, das einen JAX-WS-Service darstellt, verwenden Sie die Unterklasse javax.xml.ws.Service, die vom Tool wsimport generiert wird, als Wert für service-interface. Dies ist die Klasse, die die Annotation "@WebServiceClient" enthält. Wenn Sie ein Element service-ref definieren, das einen JAX-WS-Port darstellt, ist der Wert von service-interface weiterhin die Unterklasse "javax.xml.ws.Service", die vom Tool wsimport generiert wird, und der Wert von service-ref-type gibt die vom Port verwendete Serviceendpunktschnittstellenklasse an. Die Serviceendpunktschnittstellenklasse wird ebenfalls von wsimport generiert und ist mit der Annotation "@WebService" annotiert.

Vorgehensweise

  1. Definieren Sie den service-ref-Eintrag im Implementierungsdeskriptor application-client.xml, web.xml bzw. ejb-jar.xml.
    Angenommen, eine WAR-Datei (Webarchiv) enthält einen Implementierungsdeskriptor WEB-INF/web.xml, der die folgenden service-ref-Einträge enthält:
    <service-ref>
      <service-ref-name>service/ExampleService</service-ref-name>
      <service-interface>com.ibm.sample.ExampleService</service-interface>
    </service-ref>
    
    <service-ref>
      <service-ref-name>service/ExamplePort</service-ref-name>
      <service-interface>com.ibm.sample.ExampleService</service-interface>
      <service-ref-type>com.ibm.sample.ExamplePort</service-ref-type>
    </service-ref>
    
    <service-ref>
      <service-ref-name>service/ExamplePortInjected</service-ref-name>
      <service-interface>com.ibm.sample.ExampleService</service-interface>
      <service-ref-type>com.ibm.sample.ExamplePort</service-ref-type>
    
      <injection-target>
        <injection-target-class>com.ibm.sample.J2EEClient</injection-target-class>
        <injection-target-name>injectedPort</injection-target-name>
      </injection-target>
    </service-ref>
    In diesem Beispiel ist com.ibm.sample.ExampleService eine generierte JAX-WS-Serviceklasse, und diese Klasse muss eine Unterklasse von "javax.xml.ws.Service" sein. Außerdem gibt die Methode ExampleService.getPort() eine Instanz von com.ibm.sample.ExamplePort zurück.
  2. Verwenden Sie die Implementierungsdeskriptoren in Ihrer Web-Service-Clientanwendung, um Ihre Anwendung anzupassen. Die folgenden Codefragmente veranschaulichen beispielhaft, wie Ihre Clientanwendung die service-ref-Einträge im WAR-Modul verwenden kann:
    import javax.xml.ws.Service;
    import com.ibm.sample.ExampleService;
    import com.ibm.sample.ExamplePort;
    
    // InitialContext-Objekt für JNDI-Lookups erstellen
    InitialContext ic = new InitialContext();
    
    // Client ruft eine Instanz der generischen Serviceklasse über JNDI ab
    Service genericService =
    (Service) ic.lookup(“java:comp/env/service/ExampleService”);
    
    // Client ruft eine Instanz der generierten Serviceklasse über JNDI ab
    ExampleService exampleService =
    (ExampleService) ic.lookup(“java:comp/env/service/ExampleService”);
    
    // Client ruft eine Instanz des Ports über JNDI ab
    ExamplePort ExamplePort =
    (ExamplePort) ic.lookup(“java:comp/env/service/ExamplePort”);
    
    // Der Container führt die Injektion einer Instanz von ExamplePort auf der Basis des Clientimplementierungsdeskriptors durch
    private ExamplePort injectedPort;

Ergebnisse

Sie können die Servicereferenzen, die im Implementierungsdeskriptor in Ihrer Clientanwendung definiert waren, jetzt verwenden. Außerdem können Sie Implementierungsdeskriptoren verwenden, um die mit den Annotationen @WebServiceRef und @Resource angegebenen Informationen zu erweitern oder zu überschreiben.

Das Implementierungsdeskriptorelement <lookup-name> ist in Java EE 6 neu und wird verwendet, um indirekt auf eine bereits definierte Servicereferenz zu verweisen. Wenn das Element <lookup-name> verwendet wird, kann nur noch das Element <service-ref-name> angegeben werden. Weitere untergeordnete Elemente von <service-ref> können nicht definiert werden.

Im folgenden Beispiel sehen Sie einen service-ref-Eintrag in einer Datei WEB-INF/web.xml, der eine Referenz auf einen JAX-WS-Service definiert, und einen service-ref-Eintrag in derselben Datei web.xml, der eine indirekte Referenz auf den ersten service-ref-Eintrag definiert:

<service-ref>
  <service-ref-name>service/ExampleService</service-ref-name>
  <service-interface>com.ibm.sample.ExampleService</service-interface>
  <service-ref-type>com.ibm.sample.ExampleServicePortType</service-ref-type>
  <wsdl-file>WEB-INF/wsdl/ExampleService.wsdl</wsdl-file>
</service-ref>

<service-ref>
  <service-ref-name>service/ExampleService2</service-ref>
  <lookup-name>java:comp/env/service/ExampleService</lookup-name>
</service-ref>

Angenommen, die zuvor gezeigten service-ref-Einträge sind in der Datei WEB-INF/web.xml definiert, dann könnte die Clientanwendung eine JNDI-Lookup-Operation mit dem Namen java:comp/env/service/ExampleService2 ausführen, und das Ergebnis wäre eine Referenz auf den Service ExampleService, der im WSDL-Dokument WEB-INF/wsdl/ExampleService.wsdl definiert, der mit dem ersten service-ref-Eintrag definiert wurde.

Nächste Schritte

Vervollständigen Sie die Clientimplementierung, indem Sie den Code für Ihre Clientanwendung schreiben, der zum Aufrufen des Web-Service verwendet wird.


Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxwsclientdd
Dateiname:twbs_jaxwsclientdd.html