2016-05-10 1 views
0

J'essaie d'utiliser des services Web de contenu Opentext (CWS) à partir de mon service Web axé sur axis2.Comment passer les en-têtes SOAP avec JAXWSProxyHandler

Ceci est un morceau de code qui crée un client proxy à CWS et transmet un jeton d'authentification dans un en-tête.

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; 
    } 

Ce code fonctionne correctement lorsqu'il est exécuté à partir d'une application Java simple. Dans ce cas, docManClient est un objet SEIStub et la méthode setOutboundHeaders fonctionne après la conversion en WSBindingProvider.

Mais lorsque ce code est exécuté à l'intérieur de mon axis2 webservice, docManClient est JAXWSProxyHandler objet et il ne peut pas être casté dans WSBindingProvider ni méthode execute de setOutboundHeaders.

Alors ma question est - Comment puis-je passer mon en-tête avec l'aide AuthElement JAXWSProxyHandler (faire la même chose que la méthode de setOutBoundHeaders faire) OU Puis-je convertir en quelque sorte l'objet JAXWSProxyHandler pour objet SEIStub?

+0

Je suis également coincé exactement à ce point. Pouvez-vous s'il vous plaît poster votre réponse qui vous a aidé à résoudre le problème? – Tony

+0

Comme je l'ai mentionné ci-dessous, j'ai jeté JAXWSProxyHandler à javax.xml.ws.BindingProvider et trouvé un moyen de lui passer des en-têtes. Comme je me souviens, je viens de lire la documentation sur la classe javax.xml.ws.BindingProvider et j'ai cherché des exemples d'en-têtes passant à l'utiliser. – ifuwannaride

Répondre

1

Le problème se produit car vous utilisez une API spécifique à l'implémentation JAX-WS dans JRE. Cependant, lors de l'exécution sur Axis2, l'implémentation JAX-WS fournie par Axis2 sera utilisée à la place. Cette implémentation prend en charge un ensemble différent d'extensions d'API. Cela signifie que votre code n'est pas portable dans différentes implémentations JAX-WS. Vous avez deux options:

  • Faites-le portable en utilisant uniquement des API standard. Dans votre cas, cela nécessiterait l'implémentation d'un gestionnaire JAX-WS qui ajoute l'en-tête. Pour transmettre le authToken au gestionnaire, vous devez convertir le client en BindingProvider et ajouter les données au contexte de la demande. Supprimez le JAR axis2-jaxws de votre déploiement Axis2 afin que votre code utilise l'implémentation JAX-WS de JRE. Bien sûr, cela ne fonctionnera pas si le service lui-même est déployé en tant que service JAX-WS. Malheureusement, l'extrait de code ne montre pas si c'est le cas ou non.

+0

Merci d'avoir répondu. Cependant, j'ai déjà trouvé une solution. Il semble que j'ai utilisé la première option que vous mentionnez. J'ai jeté JAXWSProxyHandler à javax.xml.ws.BindingProvider et que modifié SOAPHeader d'une manière différente. Je vous remercie. – ifuwannaride