And additionally, how to get rid of the faultactor element? Yves
On Mon, 2006-03-13 at 11:15 -0500, Tony Dean wrote: > Chinthaka, > > After retrying this just now, it almost works but not quite. > > The results follow: > > <?xml version="1.0" encoding="UTF-8" ?> > - <soapenv:Envelope > xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> > <soapenv:Header /> > - <soapenv:Body> > - <soapenv:Fault> > <faultcode > xmlns:fault="http://support.sas.com/xml/namespace/biwebservices/webservicemaker-9.2">fault:FaultExceptionClient</faultcode> > > > <faultstring>com.sas.web.services.maker.FaultExceptionunknown</faultstring> > <faultactor>http://myAxisServer/role/default</faultactor> > - <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> > > Notice the "Cient" text concatentated on the end of > "fault:FaultException" in the faultcode. "Client" is your default > faultcode. > Likewise, notice the "unknown" text concatenated on the end of > "com.sas.web.services.maker.FaultException". > > Thanks. > > > > ______________________________________________________________________ > From: Eran Chinthaka [mailto:[EMAIL PROTECTED] > Sent: Friday, March 10, 2006 12:51 PM > To: [email protected] > Subject: Re: [AXIS2] soapFault question > > > > 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: > > > > > > > Hi, > > > > > > What is wrong with the following: > > > > > > 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(Constants.WEBSERVICEMAKER_NS, "m"); > > > soapFaultCode.setText("m:FaultException"); > > > SOAPFaultReason soapFaultReason = > > > soapFactory.createSOAPFaultReason(soapFault); > > > soapFaultReason.setText(FaultException.class.getName()); > > > SOAPFaultDetail soapFaultDetail = > > > soapFactory.createSOAPFaultDetail(soapFault); > > > > > > QName qName = new QName(Constants.WEBSERVICEMAKER_NS, > > > "FaultException"); > > > OMElement detail = soapFactory.createOMElement(qName, > > > null); > > > qName = new QName(Constants.WEBSERVICEMAKER_NS, > > > "ExceptionMessage"); > > > Throwable e = t; > > > while (e != null) { > > > OMElement exception = > > > soapFactory.createOMElement(qName, null); > > > exception.setText(t.getMessage()); > > > detail.addChild(exception); > > > e = e.getCause(); > > > } > > > > > > AxisFault axisFault = new AxisFault(soapFault); > > > throw axisFault; > > > > > > I end up with a nullPointerException message in the fault as presented to > > > the client instead of what I intended. Should be something like: > > > > > > <Body> > > > <Fault> > > > <faultcode xmlns:m="myNamespace">m:FaultException</faultcode> > > > <faultstring>com.sas.web.services.maker.FaultException</faultcode> > > > <detail> > > > <FaultException xmlns="myNamespace"> > > > <ExceptionMessage>first exception msg...</ExceptionMessage> > > > <ExceptionMessage>second exception msg...</ExceptionMessage> > > > ... > > > </FaultException> > > > </detail> > > > </Fault> > > > </Body> > > > > > > Thanks for any advice. > > > > > > Tony Dean > > > SAS Institute Inc. > > > 919.531.6704 > > > [EMAIL PROTECTED] > > > > > > SAS... The Power to Know > > > http://www.sas.com > > > > > > > > > > > > > > > > > > >
