Hi.
To avoid error with namespace I've writen a custom interceptor, now my
client unmarshall the fault without namespace exception, but i get this
another one:
14:06:44.658 [ERROR] [http-nio-8080-exec-2]
es.pilli.teu.service.DefaultEnvioBoeService - Error al consultar el envío.
javax.xml.ws.soap.SOAPFaultException: Invalid SOAP fault content
at
org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:161)
~[cxf-rt-frontend-jaxws-3.1.0.jar:3.1.0]
at com.sun.proxy.$Proxy84.consultaEnvio(Unknown Source) ~[na:na]
at
es.pilli.teu.service.DefaultEnvioBoeService.consultarEnvio(DefaultEnvioBoeService.java:503)
~[main/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
~[na:1.7.0_67]
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
~[na:1.7.0_67]
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[na:1.7.0_67]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_67]
at
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
[spring-aop-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:201)
[spring-aop-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at com.sun.proxy.$Proxy92.consultarEnvio(Unknown Source) [na:na]
at
es.pilli.teu.web.EnvioController.crearEnvio(EnvioController.java:78)
[main/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
~[na:1.7.0_67]
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
~[na:1.7.0_67]
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[na:1.7.0_67]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_67]
at
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
[spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
[spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
[tomcat-embed-websocket-8.0.23.jar:8.0.23]
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
[na:1.7.0_67]
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
[na:1.7.0_67]
at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
[tomcat-embed-core-8.0.23.jar:8.0.23]
at java.lang.Thread.run(Thread.java:745) [na:1.7.0_67]
Caused by: org.apache.cxf.binding.soap.SoapFault: Invalid SOAP fault content
at
org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:86)
~[cxf-rt-bindings-soap-3.1.0.jar:3.1.0]
at
org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:52)
~[cxf-rt-bindings-soap-3.1.0.jar:3.1.0]
at
org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:41)
~[cxf-rt-bindings-soap-3.1.0.jar:3.1.0]
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
~[cxf-core-3.1.0.jar:3.1.0]
at
org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
~[cxf-core-3.1.0.jar:3.1.0]
at
org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
~[cxf-rt-bindings-soap-3.1.0.jar:3.1.0]
at
org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
~[cxf-rt-bindings-soap-3.1.0.jar:3.1.0]
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
~[cxf-core-3.1.0.jar:3.1.0]
at
org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:802)
~[cxf-core-3.1.0.jar:3.1.0]
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1642)
~[cxf-rt-transports-http-3.1.0.jar:3.1.0]
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1533)
~[cxf-rt-transports-http-3.1.0.jar:3.1.0]
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1336)
~[cxf-rt-transports-http-3.1.0.jar:3.1.0]
at
org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:56)
~[cxf-core-3.1.0.jar:3.1.0]
at
org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:215)
~[cxf-core-3.1.0.jar:3.1.0]
at
org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
~[cxf-core-3.1.0.jar:3.1.0]
at
org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:652)
~[cxf-rt-transports-http-3.1.0.jar:3.1.0]
at
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
~[cxf-core-3.1.0.jar:3.1.0]
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
~[cxf-core-3.1.0.jar:3.1.0]
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:516)
~[cxf-core-3.1.0.jar:3.1.0]
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:425)
~[cxf-core-3.1.0.jar:3.1.0]
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:326)
~[cxf-core-3.1.0.jar:3.1.0]
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:279)
~[cxf-core-3.1.0.jar:3.1.0]
at
org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
~[cxf-rt-frontend-simple-3.1.0.jar:3.1.0]
at
org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:139)
~[cxf-rt-frontend-jaxws-3.1.0.jar:3.1.0]
... 47 common frames omitted
My custom interceptor code:
package es.pilli.teu.ws;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.apache.cxf.binding.soap.Soap11;
import org.apache.cxf.binding.soap.SoapFault;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.common.i18n.Message;
import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.interceptor.ClientFaultConverter;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.staxutils.StaxUtils;
import org.w3c.dom.Element;
public class SoapFaultInInterceptor extends AbstractSoapInterceptor {
private static final java.util.logging.Logger LOG =
LogUtils.getL7dLogger(SoapFaultInInterceptor.class);
public SoapFaultInInterceptor() {
super(Phase.UNMARSHAL);
addBefore(ClientFaultConverter.class.getName());
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
XMLStreamReader reader = message.getContent(XMLStreamReader.class);
message.setContent(Exception.class, unmarshalFault(message,
reader));
}
public static SoapFault unmarshalFault(SoapMessage message,
XMLStreamReader reader) {
String exMessage = "";
QName faultCode = null;
String role = null;
Element detail = null;
try {
while (reader.nextTag() == XMLStreamReader.START_ELEMENT) {
if (reader.getLocalName().equals("faultcode")) {
String value = reader.getElementText();
int index = value.indexOf(":");
if (index == -1) {
faultCode = new QName(value);
} else {
String prefix = value.substring(0, index);
String localName = value.substring(index + 1);
String nsUri =
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
faultCode = new QName(nsUri, localName, prefix);
}
} else if (reader.getLocalName().equals("faultstring")) {
exMessage = reader.getElementText();
} else if (reader.getLocalName().equals("faultactor")) {
role = reader.getElementText();
} else if (reader.getLocalName().equals("detail")) {
//XMLStreamReader newReader = new
DepthXMLStreamReader(reader);
detail = StaxUtils.read(reader).getDocumentElement();
}
}
} catch (XMLStreamException e) {
throw new SoapFault("Could not parse message.", e,
message.getVersion().getSender());
}
// if the fault's content is invalid and faultCode is not
found, blame the receiver
if (faultCode == null) {
faultCode = Soap11.getInstance().getReceiver();
exMessage = new Message("INVALID_FAULT", LOG).toString();
}
SoapFault fault = new SoapFault(exMessage, faultCode);
fault.setDetail(detail);
fault.setRole(role);
return fault;
}
}
Can anyone help me?
Thanks and best regards.
El 08/06/15 a las 17:40, "Ángel L. García Sánchez" escribió:
Hi Aki.
The problem is that i don't get access to server side.
Can i avoid this error with namespace?
Thanks and best regards.
El 08/06/15 a las 15:26, Aki Yoshida escribió:
The error message says your server is returning an invalid SOAP fault
(the wsse prefix is not bound).
It should be returning something like ...<faultcode
xmlns:wssec="...">wsse:InvalidSecurityToken</faultcode> ....
and your CXF client is complaining about it.
2015-06-08 12:51 GMT+02:00 "Ángel L. García Sánchez"
<[email protected]>:
Hi.
I'm developing a web service client with Apache CXF 3.1.0 (also test
with
2.7.16). When the soap message validation fails on server I get a
soap fault
like this:
Payload: <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>wsse:InvalidSecurityToken</faultcode><faultstring>Se
ha proporcionado un token de seguridad
erróneo</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
But when my client tries to unmarshall the fault I get this exception:
java.lang.RuntimeException: Invalid QName in mapping:
wsse:InvalidSecurityToken
at
org.apache.cxf.staxutils.StaxUtils.readQName(StaxUtils.java:1839)
~[cxf-api-2.7.16.jar:2.7.16]
at
org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:64)
~[cxf-rt-bindings-soap-2.7.16.jar:2.7.16]
at
org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
~[cxf-rt-bindings-soap-2.7.16.jar:2.7.16]
at
org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
~[cxf-rt-bindings-soap-2.7.16.jar:2.7.16]
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
[cxf-api-2.7.16.jar:2.7.16]
at
org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
[cxf-api-2.7.16.jar:2.7.16]
at
org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
[cxf-rt-bindings-soap-2.7.16.jar:2.7.16]
at
org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
[cxf-rt-bindings-soap-2.7.16.jar:2.7.16]
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
[cxf-api-2.7.16.jar:2.7.16]
at
org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:849)
[cxf-api-2.7.16.jar:2.7.16]
............
How to get around this error?
Thanks and best regards.