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
> > > 
> > > 
> > >  
> > > 
> > >     
> > 
> >   

Reply via email to