Einhaltung von WSDL-Bindungen in JAX-WS-Web-Services durchsetzen

In Java™ API for XML-Based Web Services (JAX-WS) Version 2.1 wurde das Konzept der Features als Methode zur programmgesteuerten Steuerung bestimmter Funktionen und Verhaltensweisen eingeführt. RespectBindingFeature ist eines der unterstützten Standardfeatures. Mit RespectBindingFeature können Sie steuern, ob eine JAX-WS-Implementierung erforderlich ist, damit der Inhalt der WSDL-Bindung (Web Services Description Language), die einem Endpunkt zugeordnet ist, berücksichtigt wird.

Informationen zu dieser Task

Obwohl im Entwicklungsprozess häufig WSDL-Dokumente verwendet werden, ist die tatsächliche Verwendung bereitgestellter WSDL-Dokumentspezifikationen zur Laufzeit in den Versionen der Spezifikation JAX-WS vor Version 2.1 nicht klar definiert. In der Spezifikation JAX-WS Version 2.1 wurde das Feature "RespectBindingFeature" hinzugefügt, um die Auswirkung des Elements "wsdl:binding" in einer JAX-WS-Laufzeitumgebung klar zu definieren.

Die Aktivierung des Features "RespectBindingFeature" bewirkt, dass die JAX-WS-Laufzeitumgebung das Element "wsdl:binding" für einen Endpunkt zur Laufzeit überprüft, um sicherzustellen, dass die Bindung der SEI-Parameter (Service Endpoint Interface, Serviceendpunktschnittstelle) und die Rückgabewerte berücksichtigt werden. Außerdem stellt dieses Feature sicher, dass alle erforderlichen Erweiterungen von wsdl:binding von der Laufzeitumgebung verstanden und verwendet werden bzw. dass die Erweiterungen von der Anwendung explizit inaktiviert wurden. Ihre JAX-WS-Anwendung kann eine bestimmte wsdl:binding-Erweiterung, die eine definierte WebServiceFeature-Schnittstelle hat, inaktivieren, indem sie die entsprechende Annotation, die diesem Feature zugeordnet ist, mithilfe einer API verwendet, die die Schnittstelle "javax.xml.ws.WebServiceFeature" akzeptiert, oder indem sie die Implementierungsdeskriptoren konfiguriert.

Wenn das Feature "RespectBindingFeature" nicht aktiviert ist, was die Standardeinstellung ist, kann die Laufzeitumgebung wählen, ob Teile des Elements "wsdl:binding" umgesetzt werden.

Vorgehensweise

  1. Entwickeln Sie Java-Artefakte für Ihre JAX-WS-Anwendung, die eine WSDL-Datei (Web Services Description Language) enthält, die Ihre Web-Service-Anwendung darstellt.
    1. Wenn Sie mit einer WSDL-Datei beginnen, entwickeln Sie mit dem Befehl "wsimport" Java-Artefakte aus einer WSDL-Datei , um die erforderlichen portierbaren JAX-WS-Artefakte zu generieren.
    2. Wenn Sie mit JavaBeans -Komponenten beginnen, entwickeln Sie Java-Artefakte für JAX-WS-Anwendungen und generieren Sie mit dem Befehl wsgen eine WSDL-Datei.
  2. Wenn Sie RespectBindingFeature in Ihrer Endpunktimplementierungsklasse aktivieren möchten, verwenden Sie dazu eine der folgenden Methoden:
    • Annotation "@RespectBinding" im Endpunkt verwenden.

      Zum Aktivieren von RespectBinding in einem Endpunkt verwenden Sie die Annotation "@RespectBinding" (javax.xml.ws.RespectBinding) im Endpunkt. Die Annotation "@RespectBinding" hat nur einen einzigen Parameter, den Parameter enabled. Dieser Parameter ist optional. Der Parameter "enabled" hat einen booleschen Wert und gibt an, ob RespectBindingFeature für den JAX-WS-Endpunkt aktiviert ist.

      Das folgende Beispielsnippet veranschaulicht das Hinzufügen der Annotation "@RespectBinding" für den JAX-WS-Endpunkt MyServiceImpl:
      @RespectBinding(enabled=true))
      @WebService
      public class MyServiceImpl {
      ...
      }
    • Implementierungsdeskriptorelement <respect-binding> verwenden.
      Sie können das Element <respect-binding> im Element <port-component> des Implementierungsdeskriptors "webservices.xml" als Alternative zur Annotation "@RespectBinding" in der Implementierungsklasse des Serviceendpunkts verwenden. Beispiel:
      <port-component>
           <port-component-name>MyPort1</port-component-name>
           <respect-binding>
               <enabled>true</enabled>
           </respect-binding>
           <service-impl-bean>
               <servlet-link>MyPort1ImplBean</servlet-link>
           </service-impl-bean>
      </port-component>
  3. Wenn Sie RespectBindingFeature in Ihrem Client aktivieren möchten, verwenden Sie eine der folgenden Methoden:
    • RespectBindingFeature in einem Dispatchclient verwenden. Beispiel:
      RespectBindingFeature respectBinding = new RespectBindingFeature();
      Service svc = Service.create(serviceName);
      svc.addPort(portName, SOAPBinding.SOAP11_HTTP_BINDING, endpointUrl);
      Dispatch<Source> dsp = svc.createDispatch(portName, Source.class, Service.Mode.PAYLOAD, respectBinding);
    • RespectBindingFeature in einem dynamischen Proxyclient verwenden. Beispiel:
      // Create a dynamic proxy with RespectBinding enabled.
        Service svc = Service.create(serviceName);
        RespectBindingFeature respectBinding = new RespectBindingFeature();
        RespectBindingSample proxy = svc.getPort(portName, RespectBindingSample.class, respectBinding);
    • RespectBindingFeature im Client mithilfe der Annotation "@RespectBinding" aktivieren. Beispiel:
      public class MyClientApplication {
      
                     // Enable RespectBinding for a port-component-ref resource injection.
                         @RespectBinding(enabled=true)
                         @WebServiceRef(MyService.class)
                         private MyPortType myPort;
                     ...
      }
    • RespectBindingFeature im Client mithilfe von Implementierungsdeskriptorelementen in einem Element "port-component-ref" aktivieren. Beispiel:
      <service-ref>
          <service-ref-name>service/MyPortComponentRef</service-ref-name>
          <service-interface>com.example.MyService</service-ref-interface>
          <port-component-ref>
              <service-endpoint-interface>com.example.MyPortType</service-endpoint-interface>
              <respect-binding>
                  <enabled>true</enabled>
              </respect-binding>
          </port-component-ref>
      </service-ref>

Ergebnisse

Durch die Implementierung des Features "RespectBindingFeature" haben Sie festgelegt, dass der Inhalt einer WSDL-Bindung, die einem Endpunkt für Ihre JAX-WS-Anwendung zugeordnet ist, eingehalten werden muss.