2009-05-06 8 views
22

Un tipico client SOAP utilizzando JAX-WS potrebbe essereCome faccio ad aggiungere un'intestazione SOAP utilizzando Java JAX-WS richiesta

FooService service = new FooService(); 
FooPort port = service.getFooPort(); 
FooPayload payload = new FooPayload(); 
payload.setHatSize(3); 
payload.setAlias("The Hat"); 
... 
port.processRequest(payload); 

Questo genera un qualcosa di contenuti richiesta HTTP come

<?xml ... ?> 
<S:Envelope xmlns:S="http://...soap-envelope"> 
    <S:Body> 
    <!-- payload --> 
    </S:Body> 
</S:Envelope> 

Manipolando gli argomenti della chiamata a port.processRequest() possono influenzare solo la parte "payload". Non è possibile modificare la parte esterna del messaggio XML.

voglio inserire un'intestazione SOAP appena prima che il corpo SOAP

<S:Header> 
    <X:Security xmlns:X="http://...wsssecurity...> 
     <X:BinarySecurityToken>kjh...897=</X:BinarySecurityToken> 
    </X:Security> 
</S:Header> 

Come posso fare?

+0

Il WSDL descrive le intestazioni? Se è così, allora JAX-WS non genera il codice per aggiungerli? –

risposta

1

potresti voler controllare gestori e catene di gestori.- Di recente ho dovuto aggiungere un cookie a una determinata chiamata Webservice e questo è stato il modo in cui l'ho fatto, ho appena creato un gestore che ha intercettato la chiamata iniziale e ha iniettato il cookie, si può anche manipolare le intestazioni di chiamata con un pivot Handler

18

Grazie Nuno,

Non appena io lavoro fuori come accedere correttamente al stackoverflow.com farò la cosa giusta con la vostra risposta.

Nel frattempo ecco il codice ho finito con:

FooService service = new FooService(); 
service.setHandlerResolver(new HandlerResolver() { 
    public List<Handler> getHandlerChain(PortInfo portInfo) { 
     List<Handler> handlerList = new ArrayList<Handler>(); 
     handlerList.add(new RGBSOAPHandler()); 
     return handlerList; 
    } 
}); 
FooPort port = service.getFooPort(); 
FooPayload payload = new FooPayload(); 
payload.setHatSize(3); 
payload.setAlias("The Hat"); 
... 
port.processRequest(payload); 

e

class RGBSOAPHandler implements SOAPHandler<SOAPMessageContext> { 

    public Set<QName> getHeaders() { 
     return new TreeSet(); 
    } 

    public boolean handleMessage(SOAPMessageContext context) { 
     Boolean outboundProperty = 
      (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
     if (outboundProperty.booleanValue()) { 
      SOAPMessage message = context.getMessage(); 
      try { 
       SOAPEnvelope envelope = context.getMessage() 
         .getSOAPPart().getEnvelope(); 
       SOAPFactory factory = SOAPFactory.newInstance(); 
       String prefix = "X"; 
       String uri = "http://...wsssecurity..."; 
       SOAPElement securityElem = 
         factory.createElement("Security",prefix,uri); 
       SOAPElement tokenElem = 
         factory.createElement("BinarySecurityToken",prefix,uri); 
       tokenElem.addTextNode("kjh...897="); 
       securityElem.addChildElement(tokenElem); 
       SOAPHeader header = envelope.addHeader(); 
       header.addChildElement(securityElem); 

      } catch (Exception e) { 
       System.out.println("Exception in handler: " + e); 
      } 
     } else { 
      // inbound 
     } 
     return true; 
    } 

    public boolean handleFault(SOAPMessageContext context) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public void close(MessageContext context) { 
     // 
    } 
} 
+0

Sto seguendo la stessa procedura, ma sto ricevendo la seguente eccezione: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: è stato effettuato un tentativo di inserire un nodo in cui non è consentito. Hai riscontrato questo problema? L'app è in esecuzione su weblogic 10.1 – Vladimir

0

per intestazione aggiuntivo di sapone, se si implementa il WS sul server di applicazioni Web, la volontà era aggiungi la parte di sicurezza nell'intestazione, dopo aver configurato secondo lo standard WS-SECURITY, come la politica web ecc. Non capisco perché è necessario aggiungersi tranne la parte di contenuto crittografato, come password crittografata ecc.

Problemi correlati