2010-07-01 7 views
7

Hallo, ich versuche, eine Sicherheit Header in einem Java Axis2 Client-Programm im Format von zu generieren.Axis Sicherheits-Header

<soapenv:Header> 
<wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext> 
    <wsse:UsernameToken> 
    <wsse:Username>myUsername</wsse:Username> 
    <wsse:Password>myPassword</wsse:Password> 
    </wsse:UsernameToken> 
</wsse:Security> 
</soapenv:Header> 

den folgenden Code verwenden

SOAPHeaderElement wsseSecurity = new SOAPHeaderElement(new PrefixedQName("http://schemas.xmlsoap.org/ws/2002/04/secext","Security", "wsse")); 
MessageElement usernameToken = new MessageElement("", "wsse:UsernameToken"); 
MessageElement username = new MessageElement("", "wsse:Username"); 
MessageElement password = new MessageElement("", "wsse:Password"); 
username.setObjectValue(myProps.getProperty("username")); 
usernameToken.addChild(username); 
password.setObjectValue(myProps.getProperty("password")); 
usernameToken.addChild(password); 
wsseSecurity.addChild(usernameToken); 

BookingPort bp = bsl.getBooking(); 
((Stub) bp).setHeader(wsseSecurity); 

Leider erzeugen, es ist nicht ganz das, was ich wollte, und ich erhalte.

<soapenv:Header> 
<wsse:Security soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext"> 
    <wsse:UsernameToken xmlns:wsse=""> 
    <wsse:Username xmlns:wsse="">myUsername</wsse:Username> 
    <wsse:Password xmlns:wsse="">myPassword</wsse:Password> 
    </wsse:UsernameToken> 
</wsse:Security> 
</soapenv:Header> 

Der Dienst am anderen Ende scheint nicht die zusätzlichen Bits zu handhaben, zu einem Fehler führt

faultDetail: 
     {http://xml.apache.org/axis/}stackTrace:com.ctc.wstx.exc.WstxParsingException: Non-default namespace can not map to empty URI (as per Namespace 1.0 # 2) in XML 1.0 documents 
at [row,col {unknown-source}]: [1,450] 

Wie kann ich die SOAPHeader- erzeugen nicht alle zusätzlichen leeren Bits auszudrucken? Cheers

+0

, wie man Seife Header in Diensten ..bitte den Beispielcode geben mir zu schaffen ... Java und axis2 1.6.7 –

Antwort

6

Sie übergeben eine leere Zeichenfolge als erstes Argument an MessageElement, und Sie müssen null übergeben. Beachten Sie, dass null und die leere Zeichenfolge ("") in Java nicht identisch sind. Sie betrügen auch wirklich, indem Sie das Namespacepräfix an den Parameter local name (second) des MessageElement-Konstruktors übergeben ... dafür ist es nicht gedacht. Das heißt, Sie können das Problem beheben, indem Sie null als Namespace (erster) -Parameter übergeben. Wenn Sie es versuchen direkt zu passieren, werden Sie wahrscheinlich eine mehrdeutige Konstruktor Fehler bekommen, so etwas tun, wie folgt aus:

SOAPHeaderElement wsseSecurity = new SOAPHeaderElement(new PrefixedQName("http://schemas.xmlsoap.org/ws/2002/04/secext","Security", "wsse")); 
String nullString = null; 
MessageElement usernameToken = new MessageElement(nullString, "wsse:UsernameToken"); 
MessageElement username = new MessageElement(nullString, "wsse:Username"); 
MessageElement password = new MessageElement(nullString, "wsse:Password"); 
username.setObjectValue(myProps.getProperty("username")); 
usernameToken.addChild(username); 
password.setObjectValue(myProps.getProperty("password")); 
usernameToken.addChild(password); 
wsseSecurity.addChild(usernameToken); 

BookingPort bp = bsl.getBooking(); 
((Stub) bp).setHeader(wsseSecurity); 

ich auch empfehlen würde Sie einen anderen Web-Service-Engine verwenden (nicht Axis2), wenn Sie habe eine Wahl in der Sache.

2

auf diese Weise versuchen benutzerdefinierten Header mit Axis 1. * (Der obige Code sieht nicht wie mit Axis2)

import org.apache.axis.message.SOAPHeaderElement; 
import javax.xml.soap.SOAPElement; 


public void createCustomHeader(){ 

SOAPElement oHeaderElement; 
SOAPElement oElement; 

    oHeaderElement = new SOAPHeaderElement("http://ws.mycompany.com", "securityHeader"); 
    oHeaderElement.setPrefix("sec"); 
    oHeaderElement.setMustUnderstand(false); 

    oElement = oHeaderElement.addChildElement("username"); 
    oElement.addTextNode("myusername"); 
    oElement = oHeaderElement.addChildElement("password"); 
    oElement.addTextNode("mypassword"); 

    // You can create client code something like this.. 
    MySampleServiceServiceLocator service = new MySampleServiceServiceLocator(); 
    service.setMySampleServiceEndpointAddress("endpointURL"); 
    MySampleWebService serv = service.getMySampleService(); 
    MySampleServiceSoapBindingStub stub = (MySampleServiceSoapBindingStub)serv; 

    // add this header to your stubs 
stub.setHeader(oHeaderElement); 


// Finally call your web service methid 
serv.getMyClaimStatus("XYZ001"); 


} 

//It creates the custom header like this: 

<soapenv:Header> 
    <sec:securityHeader xmlns:sec="http://ws.mycompany.com" 
     soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0"> 
     <sec:username>myusername</sec:username> 
     <sec:password>mypassword</sec:password> 
    </sec:securityHeader> 
</soapenv:Header> 
+0

Arbeitete für mich, danke! –

Verwandte Themen