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".
Si te fijas en el codigo al esquema original
se asignas dos tags
Uno 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.