|
Hi Tony, There is a problem in Axis2 with linking AxisFault and fault handling. But change your code to the following and it will work. Basically set all your fault properties to message context and throw the fault. MessageContext messageContext = null; // you must have to the current message context, when you are throwing the fault Exception t = new Exception("Eureka, Says Archimedes and runs naked on the road"); SOAPFactory soapFactory = OMAbstractFactory.getSOAP11Factory(); SOAPFaultCode soapFaultCode = soapFactory.createSOAPFaultCode(); soapFaultCode.declareNamespace("http://someuri.org", "m"); SOAPFaultValue soapFaultValue = soapFactory.createSOAPFaultValue(soapFaultCode); soapFaultValue.setText("m:FaultException"); messageContext.setProperty(SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME, soapFaultCode); SOAPFaultReason soapFaultReason = soapFactory.createSOAPFaultReason(); SOAPFaultText soapFaultText = soapFactory.createSOAPFaultText(soapFaultReason); soapFaultText.setText("This is some fault reason"); messageContext.setProperty(SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME, soapFaultReason); SOAPFaultDetail soapFaultDetail = soapFactory.createSOAPFaultDetail(); QName qName = new QName("http://someuri.org", "FaultException"); OMElement detail = soapFactory.createOMElement(qName, null); qName = new QName("http://someuri.org", "ExceptionMessage"); Throwable e = t; while (e != null) { OMElement exception = soapFactory.createOMElement(qName, null); exception.setText(t.getMessage()); detail.addChild(exception); e = e.getCause(); } messageContext.setProperty(SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME, soapFaultDetail); throw new AxisFault("Something unusual is happening !!!"); -- Chinthaka Tony Dean wrote: Chinthaka, Making those changes fixes up the SOAPFault. Here's what the debugger says the envelope looks like just before I throw the AxisFault:<?xml version='1.0' encoding='utf-8'?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <soapenv:Fault> <faultcode xmlns:m="http://support.sas.com/xml/namespace/biwebservices/webservicemaker-9.2">m:FaultException</faultcode> <faultstring>com.sas.web.services.maker.FaultException</faultstring> <detail> <FaultException xmlns="http://support.sas.com/xml/namespace/biwebservices/webservicemaker-9.2"> <ExceptionMessage>Service "myService1234" already exists.</ExceptionMessage> </FaultException> </detail> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope> This is good! now I do the following: AxisFault axisFault = new AxisFault(soapFault); throw axisFault; This is what the client sees: <?xml version='1.0' encoding='UTF-8'?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header /> <soapenv:Body> <soapenv:Fault> <faultcode>m:FaultException</faultcode> <faultstring>unknown</faultstring> <faultactor>http://myAxisServer/role/default</faultactor> <detail> <soapenv:Exception>org.apache.axis2.AxisFault at com.sas.web.services.maker.axis2.WebServiceMakerPortTypeSkeleton.MakeWebService(WebServiceMakerPortTypeSkeleton.java:293) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at org.apache.axis2.receivers.RawXMLINOutMessageReceiver.invokeBusinessLogic(RawXMLINOutMessageReceiver.java:124) at org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver.receive(AbstractInOutSyncMessageReceiver.java:37) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:331) at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:274) at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:150) at javax.servlet.http.HttpServlet.service(HttpServlet.java:709) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:534) </soapenv:Exception> </detail> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope> This is not what I want. How can I get the soapFault that I formulated back to the client? Thanks. -----Original Message----- From: Eran Chinthaka [mailto:[EMAIL PROTECTED]] Sent: Friday, March 10, 2006 12:53 AM To: [email protected] Subject: Re: [AXIS2] soapFault question Hi Tony, Seems like you have tried to create the faults using SOAP 1.1 api. You may also agree that the fault hierarchy in SOAP 1.1 and 1.2 are different. So some time back we decided to have the SOAP 1.2 api across the engine for consistency and developer convenience. Users must always create all the SOAP messages using SOAP 1.2 api. And if they want to change the version, they just need to switch the factories. Axiom SOAP implementation will take care of all the other work (like serialization) transparent to the user. I changed your code so that it will run properly with the above explanation. I added some hypothetical information, as I wanted to re-create the bug. Here we go. Exception t = new Exception("Eureka, Says Archimedes and runs naked on the road"); SOAPFactory soapFactory = OMAbstractFactory.getSOAP11Factory(); SOAPEnvelope soapEnvelope = soapFactory.createSOAPEnvelope(); SOAPBody soapBody = soapFactory.createSOAPBody(soapEnvelope); SOAPFault soapFault = soapFactory.createSOAPFault(soapBody); SOAPFaultCode soapFaultCode = soapFactory.createSOAPFaultCode(soapFault); soapFaultCode.declareNamespace("http://someuri.org", "m"); SOAPFaultValue soapFaultValue = soapFactory.createSOAPFaultValue(soapFaultCode); soapFaultValue.setText("m:FaultException"); SOAPFaultReason soapFaultReason = soapFactory.createSOAPFaultReason(soapFault); SOAPFaultText soapFaultText = soapFactory.createSOAPFaultText(soapFaultReason); soapFaultText.setText("This is some fault reason"); SOAPFaultDetail soapFaultDetail = soapFactory.createSOAPFaultDetail(soapFault); QName qName = new QName("http://someuri.org", "FaultException"); OMElement detail = soapFactory.createOMElement(qName, null); qName = new QName("http://someuri.org", "ExceptionMessage"); Throwable e = t; while (e != null) { OMElement exception = soapFactory.createOMElement(qName, null); exception.setText(t.getMessage()); detail.addChild(exception); e = e.getCause(); } System.out.println("soapEnvelope = " + soapEnvelope); } But I agree that throwing an NPE in this case is not a good idea :). -- Chinthaka Tony Dean wrote: |
signature.asc
Description: OpenPGP digital signature
