2010-09-27 2 views
3

Je crée un client Groovy pour un service SOAP .net qui nécessite un en-tête de savon qui ressemble à ceci:Avec CXF (en fait, GroovyWS), comment générer un en-tête SOAP avec un nœud enfant ayant un nœud de texte?

<soap:Header> 
    <HeaderInfo xmlns="http://foo.bar.com/ns"> 
     <token>abc-unique-token</token> 
    </HeaderInfo> 
</soap:Header> 

Je trouve the faq for adding headers to CXF messages et ça me fait presque, mais pas tout à fait. L'exemple qu'ils donnent pour l'option 4 ressemble à ceci:

List<Header> headers = new ArrayList<Header>() 
    Header header = new Header(new QName("http://foo.bar.com/ns", "HeaderInfo"), 
     "abc-unique-token", new JAXBDataBinding(String.class)) 
    headers.add(header) 

    proxy.client.getRequestContext().put(Header.HEADER_LIST, headers) 

En utilisant ce code, je peux l'obtenir pour ce faire:

<soap:Header> 
    <HeaderInfo xmlns="http://foo.bar.com/ns"> 
     abc-unique-token 
    </HeaderInfo> 
</soap:Header> 

Mais le nœud « HeaderInfo » manque l'enfant « jeton » nœud pour entourer "abc-unique-jeton" et je ne sais pas comment l'obtenir.

Y at-il une chose simple que je peux passer au constructeur d'en-tête pour créer ce noeud?

Un separate post parle d'utiliser une technique différente, mais cela me renvoie des erreurs autour de la SoapFactory lorsque j'essaie de l'utiliser.

Une grande partie des autres choses que j'ai trouvées devient nécessaire pour créer quelque chose qui étend une classe AbstractPhaseInterceptor avec un tas de code supplémentaire, quand ce que je veux est si proche :).

Répondre

5

j'ai pu le faire fonctionner en utilisant ce après déterminer que la méthode SOAPFactory dans le poste distinct que je l'ai mentionné besoin saaj-impl.jar au travail:

List<Header> headers = new ArrayList<Header>() 
SOAPFactory sf = SOAPFactory.newInstance() 
def authElement = sf.createElement(new QName("http://foo.bar.com/ns", "HeaderInfo")) 
def tokenElement = authElement.addChildElement("token") 
tokenElement.addTextNode("abc-unique-token") 
SoapHeader tokenHeader = new SoapHeader(
    new QName("http://foo.bar.com/ns", "HeaderInfo"), authElement); 
headers.add(tokenHeader); 
proxy.client.getRequestContext().put(Header.HEADER_LIST, headers) 

Je suis toujours curieux (et accepterait une réponse) autour de la manière recommandée par CXF et en ajoutant un nœud enfant à la classe Header.

Questions connexes