2

So my Java/Spring/CXF/MySQL webservice is up and running, complete with bean validation which throws a custom exception upon error. This all works great.

But what about unanticpated errors (Faults) the service might throw? Like what this page calls "unmodelled faults" , like a failure to connect to the backend database. To this end I deliberately put an incorrect password in my hibernate.properties file.

So I created a custom CXF interceptor to snag the soapfault:

public class MyOutSoapFaultInterceptor extends AbstractSoapInterceptor { private static Logger logger = Logger.getLogger( MyOutSoapFaultInterceptor.class);

public MyOutSoapFaultInterceptor()
{
    super(Phase.MARSHAL);
}

@Override
public void handleMessage( SoapMessage message) throws Fault
{
    logger.debug("entering");

    Exception e = message.getContent( Exception.class);
    if( e == null) {
        logger.debug("e is null");
    } else {
        logger.debug("e is not null");
        logger.debug("e.getCause:" + e.getCause());
        logger.debug("e.getMessage:" + e.getMessage());
        if( e instanceof Fault) {
            logger.debug("e is instanceOf Fault");
            SoapFault sf = SoapFault.createFault((Fault) e, message.getVersion());
            logger.debug("sf is not null");
            logger.debug("sf.getCause:" + sf.getCause());
            logger.debug("sf.getMessage:" + sf.getMessage());
            logger.debug("sf.getStatusCode:" + sf.getStatusCode());
            logger.debug("sf.getCode:" + sf.getCode());
            Fault newwFault = new Fault( new Exception("dammit"), Fault.FAULT_CODE_SERVER);
            newwFault.setMessage("argh");
            throw newwFault;
        }
    }
}

pertinent part of appclient.xml:

<bean id="formsWebServicePortProxy" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
    <property name="wsdlDocumentUrl"  value="http://localhost:8080/dept_forms_webservice/formsService?wsdl"/>
    <property name="serviceInterface" value="mycom.dept.forms.web.endpoint.FormsEndpoint"/>
    <property name="serviceName"      value="FormsEndpointImplService"/>
    <property name="portName"         value="FormsEndpointImplPort"/>
    <property name="namespaceUri"     value="http://endpoint.web.forms.dept.mycom/"/>
</bean> 

and my NON-web client app to test my service contains this snippet:

ApplicationContext ctx = new ClassPathXmlApplicationContext("appclient.xml");
theApp.formsWebServicePortProxy = (FormsEndpoint)      ctx.getBean("formsWebServicePortProxy");

logger.debug("entering");
System.out.println("entering testFindAllPermits");

java.util.List<mycom.dept.forms.web.endpoint.Permit> list_permit;

try {
    System.out.println("inside try block");
    list_permit = formsWebServicePortProxy.findAllPermit(); // <-- error thrown
    ListIterator<Permit> iter = list_permit.listIterator();
    while( iter.hasNext()) {
        System.out.println( iter.next().toString());
    }  
} catch ( org.springframework.remoting.jaxws.JaxWsSoapFaultException f) {
    System.out.println("caught JaxWsSoapFaultException");
    f.printStackTrace();    // <-- error thrown here
} catch ( Exception e) {
    System.out.println("caught Exception");
    System.out.println("e.getCause:" + e.getCause());
    System.out.println("e.getMessage:" + e.getMessage());
    if( e instanceof FormsEndpointException) {
        System.out.println("caught FEE");
    }
    e.printStackTrace();
}

logger.debug("exiting");

yields the following when attempting to call the method on the webservice:

inside try block
caught JaxWsSoapFaultException
org.springframework.remoting.jaxws.JaxWsSoapFaultException: Error reading XMLStreamReader.; nested exception is javax.xml.ws.soap.SOAPFaultException: Error reading XMLStreamReader.
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.doInvoke(JaxWsPortClientInterceptor.java:557)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.invoke(JaxWsPortClientInterceptor.java:541)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy36.findAllPermit(Unknown Source)
    at mycom.dept.forms.app.FormsWebServiceClient.testFindAllPermits(FormsWebServiceClient.java:434)
    at mycom.dept.forms.app.FormsWebServiceClient.main(FormsWebServiceClient.java:480)
2015-12-02 23:58:55 DEBUG [dept.forms.app.FormsWebServiceClient-testFindAllPermits] - exiting
exiting
Caused by: javax.xml.ws.soap.SOAPFaultException: Error reading XMLStreamReader.
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:156)
    at com.sun.proxy.$Proxy35.findAllPermit(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.doInvoke(JaxWsPortClientInterceptor.java:580)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.doInvoke(JaxWsPortClientInterceptor.java:554)
    ... 6 more
Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
 at [row,col {unknown-source}]: [1,0]
    at com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.java:677)
    at com.ctc.wstx.sr.BasicStreamReader.handleEOF(BasicStreamReader.java:2119)
    at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2025)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1117)
    at com.ctc.wstx.sr.BasicStreamReader.nextTag(BasicStreamReader.java:1140)
    at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:139)
    at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:61)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:798)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1667)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1520)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1428)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:658)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:532)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:464)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:367)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:320)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:89)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134)
    ... 13 more

the root of all seems to be

Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog

at [row,col {unknown-source}]: [1,0....

This error turns up a few hits like this page that suggest I'm getting an empty response from the webservice. Or more precisely, an empty Soap body. But googling turns up lots of examples of "throw new Fault( new Exception( "foo"));" Maybe I'm not handling things correctly on the client end?

TIA,

Still-learning Stev

Community
  • 1
  • 1
user1201168
  • 415
  • 6
  • 19

0 Answers0