2010-07-01 27 views
7

Hola tratando de generar un encabezado de seguridad en un programa Java Axis2 Client en el formato de.Cabecera de seguridad del eje

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

usando el siguiente código

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

Desafortunadamente no es generar exactamente lo que quería y me sale.

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

El servicio en el otro extremo no parece manejar los bits adicionales, lo que resulta en un error

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] 

¿Cómo se genera el SOAPHeader a no imprimir todos los bits adicionales vacías? Cheers

+0

cómo las cabeceras de jabón en los servicios ..Por favor den el código de ejemplo para mí ... java y axis2 1.6.7 –

Respuesta

6

Está pasando una cadena vacía como primer argumento a MessageElement, y necesita pasar null. Tenga en cuenta que null y la cadena vacía ("") no son lo mismo en Java. Además, realmente está haciendo trampa pasando el prefijo de espacio de nombres al parámetro de nombre local (segundo) del constructor MessageElement ... esto no es para lo que está diseñado. Dicho esto, puede solucionar el problema pasando null como el parámetro de espacio de nombres (primero). Si se intenta pasar directamente, probablemente obtendrá un error constructor ambigua, por lo que algo como lo siguiente:

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

También recomiendo que utilice un motor de servicios web diferente (no Axis2) si tiene alguna opción en el asunto.

2

Prueba esta forma de crear encabezado personalizado con Eje 1. * (El código anterior imposible parece con 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

¡Funcionó para mí, gracias! –

Cuestiones relacionadas