2016-05-10 17 views
0

Ich versuche, Opentext Content Web Services (CWS) von meinem Axis2-basierten Web-Service zu verwenden.So übergeben Sie SOAP-Header mit JAXWSProxyHandler

Dies ist ein Code, der einen Proxy-Client für CWS erstellt und ein Authentifizierungstoken in einer Kopfzeile übergibt.

DocumentManagement_Service docManService = new DocumentManagement_Service(); 
DocumentManagement docManClient = docManService.getBasicHttpBindingDocumentManagement(); 

    try 
    { 
     // The namespace of the OTAuthentication object 
     final String ECM_API_NAMESPACE = "urn:api.ecm.opentext.com"; 

     // Create a SOAP header 
     SOAPHeader header = MessageFactory.newInstance().createMessage().getSOAPPart().getEnvelope().getHeader(); 

     // Add the OTAuthentication SOAP header element 
     SOAPHeaderElement otAuthElement = header.addHeaderElement(new QName(ECM_API_NAMESPACE, "OTAuthentication")); 

     // Add the AuthenticationToken SOAP element 
     SOAPElement authTokenElement = otAuthElement.addChildElement(new QName(ECM_API_NAMESPACE, "AuthenticationToken")); 
     authTokenElement.addTextNode(authToken); 

     // Set the SOAP header on the docManClient 
     String ENDPOINT_ADDRESS_PROPERTY = WSBindingProvider.ENDPOINT_ADDRESS_PROPERTY; 

     ((WSBindingProvider) docManClient).setOutboundHeaders(Headers.create(otAuthElement)); 
    } 
    catch (SOAPException e) 
    { 
     System.out.println("Failed to set authentication SOAP header!\n"); 
     System.out.println(e.getMessage()); 
     System.out.println(e.getStackTrace()); 
     return; 
    } 

Dieser Code funktioniert gut, wenn er von einer einfachen Java-Anwendung ausgeführt wird. In diesem Fall ist docManClient ein SEISTub Objekt und setOutboundHeaders Methode funktioniert nach dem Gießen zu WSBindingProvider.

Aber wenn dieser Code in meinem axis2 Webservice ausgeführt wird, ist docManClient JAXWSProxyHandler Objekt und es kann nicht in WSBindingProvider gegossen werden, noch setOutboundHeaders Methode ausführen.

Also meine Frage ist - Wie gebe ich meine Header mit AuthElement mit JAXWSProxyHandler (das gleiche tun wie setOutBoundHeaders Methode tun) oder kann ich irgendwie JAXWSProxyHandler Objekt SEIStub Objekt konvertieren?

+0

Ich bin auch genau an diesem Punkt fest. Kannst du bitte deine Antwort posten, die dir geholfen hat, das Problem zu lösen? – Tony

+0

Wie ich unten erwähnt habe, habe ich JAXWSProxyHandler auf javax.xml.ws.BindingProvider geworfen und einen Weg gefunden, wie man Header an ihn übergibt. Wie ich mich erinnere, habe ich gerade die Dokumentation zur javax.xml.ws.BindingProvider-Klasse gelesen und nach Beispielen für die Übergabe von Headern gesucht. – ifuwannaride

Antwort

1

Das Problem tritt auf, weil Sie eine API verwenden, die für die JAX-WS-Implementierung in der JRE spezifisch ist. Wenn Sie jedoch Axis2 verwenden, wird stattdessen die von Axis2 bereitgestellte JAX-WS-Implementierung verwendet. Diese Implementierung unterstützt einen anderen Satz von API-Erweiterungen.

Das bedeutet, dass Ihr Code nicht über verschiedene JAX-WS-Implementierungen hinweg portierbar ist. Sie haben zwei Optionen:

  • Machen Sie es portabel, indem Sie nur Standard-APIs verwenden. In Ihrem Fall würde dies die Implementierung eines JAX-WS-Handlers erfordern, der den Header hinzufügt. Um das authToken an den Handler zu übergeben, würden Sie den Client an BindingProvider übergeben und die Daten dem Anforderungskontext hinzufügen.

  • Entfernen Sie die JAR aus Ihrer Axis2-Bereitstellung, damit der Code die JAX-WS-Implementierung aus der JRE verwendet. Dies funktioniert natürlich nicht, wenn der Dienst selbst als JAX-WS-Dienst bereitgestellt wird. Leider zeigt das Code-Snippet nicht, ob das der Fall ist oder nicht.

+0

Danke für die Antwort. Allerdings habe ich selbst schon eine Lösung gefunden. Es scheint, dass ich die erste Option verwendet habe, die Sie erwähnen. Ich habe JAXWSProxyHandler in javax.xml.ws.BindingProvider umgewandelt und dann SOAPHeader auf andere Weise geändert. Vielen Dank. – ifuwannaride

Verwandte Themen