Error al crear HEADER de seguridad con JAXB
Saludos a todos,
Me topado con el siguiente error al querer agregar el header de seguridad en un web service desarrollado con sprinframework y JAXB:
javax.xml.soap.SOAPException: unable to find namespace for prefix: wsse
at weblogic.xml.saaj.SOAPElementImpl.addChildElement(SOAPElementImpl.java:357)
at pr.com.prt.eppaSapInt.ws.SecurityHeader.doWithMessage(SecurityHeader.java:48)
Esto es lo que mando como request:
[SaajUtils] SOAPElement [weblogic.xml.saaj.SOAPEnvelopeImpl] implements SAAJ 1.3
[SaajUtils] SOAPElement [weblogic.xml.saaj.SOAPBodyImpl] implements SAAJ 1.3
[sent] Sent request [DATOS EN GENERAL]
[received] Received response [AQUI COLOCA EL XML QUE MANDO]
[WebServiceTemplate] Received Fault message for request [SaajSoapMessage {http://americamovil.com/EPPA/PR/FHR/Empleados}MT_Empleados_req]
[SaajUtils] SOAPElement [weblogic.xml.saaj.SOAPFaultImpl] implements SAAJ 1.3
Este es el código donde creo el header:
public class SecurityHeader implements WebServiceMessageCallback{
@Override
public void doWithMessage(WebServiceMessage wsMessage) throws IOException, TransformerException {
SOAPMessage soapMessage = ((SaajSoapMessage)wsMessage).getSaajMessage();
SOAPHeader header;
SOAPHeaderElement security;
SOAPHeaderElement usertoken;
SOAPElement username;
SOAPElement password;
try {
header = soapMessage.getSOAPHeader();
security = header.addHeaderElement(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security", "wsse"));
usertoken = header.addHeaderElement(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "UsernameToken", "wsu"));
username = usertoken.addChildElement("Username", "wsse");
password = usertoken.addChildElement("Password", "wsse");
password.setAttribute("Type","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
username.setTextContent("eppa2SAP_app");
password.setTextContent("eppa2SAP_app123");
security.addChildElement(username);
security.addChildElement(password);
security.addChildElement(usertoken);
JAXBContext context = JAXBContext.newInstance();
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(null, ((SoapHeader) soapMessage).getResult());
} catch (JAXBException e) {
throw new IOException("error while marshalling authentication JAXB.");
} catch (MarshallingException e) {
throw new IOException("error while marshalling authentication exception.");
} catch (SOAPException e1) {
e1.printStackTrace();
}
}
- Inicie sesión o regístrese para enviar comentarios
unable to find namespace for prefix
revisa el xml que genera, pareciera que en algún lado está generando un tag o una etiqueta que empieza con wsse:
por eso el error que da de: unable to find namespace for prefix: wsse
Es decir, un parser esta tratando de traducir de wsse a su nombre completo y pues no existe ene namespace
Revisa el esquema.
Revisa el esquema que se encuentran en las dos URL a las que haces referencia; si te fijas bien no existe ningun tag "wsse".
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secex...
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utili...
Si te fijas en el codigo al esquema original
header
se asignas dos tagsUno con el que te marca error "wsse".
Cuando se trata de generar el XML a partir de los esquemas (que se encuentran en las direcciones anteriores)
no se cuentra el tag "wsse" por eso te marca ese error.