2010-07-01 36 views
7

Bir Java Axis2 Client programında bir güvenlik başlığı oluşturmaya çalışıyorum.Eksen güvenlik başlığı

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

Maalesef onun ben istedim ve almak oldukça ne oluşturmayan aşağıdaki kodu

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

kullanarak.

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

diğer ucunda servis

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] 

nasıl tüm ekstra boş bit yazdırmak değil SOAPHeader elde edebilirim bir hataya neden fazladan bit işlemek için görünmüyor? Şerefe

+0

nasıl bana örnek kodu vermek ..Lütfen hizmetlerinde sabun başlıklarını için ... java ve axis2 1.6.7 –

cevap

6

Sen MessageElement ilk argüman olarak boş bir dize geçirerek ve null geçmesi gerekiyor. null ve boş dizenin (""), Java'da aynı şey olmadığını unutmayın. Ayrıca, MessageElement yapıcısının yerel ad (ikinci) parametresine ad alanı önekini geçirerek gerçekten aldatıyorsunuz ... bunun için tasarlandığı şey bu değil. Bu söyleniyorsa, sorunu ad alanı (ilk) parametresi olarak null geçirerek düzeltebilirsiniz. doğrudan geçmek çalışırsanız, büyük olasılıkla belirsiz bir yapıcı hata alıyorum, bu yüzden böyle bir şey yapacağız aşağıdadır:

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

Ben de farklı bir web hizmeti motorunu (değil Axis2) kullanan tavsiye ederim eğer Konuyla ilgili herhangi bir seçeneğiniz var.

2

(AXIS2 böyle görünür doesnt yukarıdaki kodu) Eksen ile 1. * özel üstbilgi oluşturmak için bu yol deneyin

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

Benim için çalıştı, teşekkürler! –