You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Milan Doshi <mi...@gmail.com> on 2008/10/14 03:49:33 UTC

Re: Handling internal errors via SOAP faults

We have defined a :

1. User Defined Exception.
2. There is a Fault element defined in WSDL.
3. The WSDL2Java geneartes a valid anotations.

HOWEVER, when we send back a Fault to the client, it is ONLY a SOAPFault
with errorMessage. No DETAIL ELEMENT is present...:(. hence our user
specific info is completely missing!!!

Can you please guide ?

We are using :
Document / Literal.
CXF2.1.2
JDK1.5_16

Any help appreciated!

Thanks,
Milan




dkulp wrote:
> 
> On Friday 07 March 2008, David CastaƱeda wrote:
>> Glen, I have been fighting against this sort of questions from several
>> weeks now,
>>
>> I start a sample project that is on Jira about correct handling,
>> unfortunately I haven't found an answer from someone who know, neither
>> I have found the way to produce correct code for server, client
>> faults.
>>
>> Anyway my idea, is to only expose the exception that can be handled by
>> the client, like InvalidCountryNameFault or
>> MaxRequestQuantityOverLimit, mark these as Client Fault, and any other
>> exception like (RuntimeException), DBNotAvailable, etc (things client
>> can't handle, ServiceException) as a general exception marked as
>> Server Fault, but as I said, I haven't found the way to do this.
> 
> That's probably because the spec specifically does not allow for them.  
> I've looked at the sample in the JIRA and there will be no way to do it, 
> per spec.  Basically, undeclared exceptions are all to be treated as 
> generic runtime exceptions and mapped, per spec, to a relatively 
> generice soap:fault on the wire and then to a SOAPFaultException on the 
> client side.  If you want properly typed exceptions, you HAVE to put 
> them on the SEI interface methods.  
> 
> Using some JAX-WS/JAXB "tricks", you can control the on-the-wire 
> representation of the exception a little more, but that won't stop it 
> from being mapped to a generic SOAPFaultException on the client side.  
> 
> For example, if we take your sample from CXF-1434 and change the 
> UncheckedWrongTextException to look like:
> 
> @WebFault(name = "UncheckedWrongTextException")
> public class UncheckedWrongTextException extends RuntimeException {
>     UncheckedWrongText i;
>     public UncheckedWrongTextException(String msg) {
>         super(msg);
>         i = new UncheckedWrongText();
>         i.setMessage(msg);
>     }
>     public UncheckedWrongTextException(String msg, int t) {
>         super(msg);
>         i = new UncheckedWrongText();
>         i.setMessage(msg);
>         i.setIdx(t);
>     }
>     public UncheckedWrongText getFaultInfo() {
>         return i;
>     }
> 
>     @XmlRootElement
>     public static class UncheckedWrongText {
>         int idx;
>         String msg;
>         public int getIdx() {
>             return idx;
>         }
>         public void setIdx(int i) {
>             idx = i;
>         }
>         public void setMessage(String m) {
>             msg = m;
>         }
>         public String getMessage() {
>             return msg;
>         }
> 
>     }
> }
> 
> And then add to HelloWorld.java:
> @XmlSeeAlso({UncheckedWrongTextException.UncheckedWrongText.class})
> 
> Then the on-the-wire fault would look like:
> 
>     
>         
>             soap:Server
>             Only characters are allowed
>             
>                 
>                     0
>                     Only characters are allowed
>                 
>             
>         
>     
>  
> 
> 
> However, the client will still only get a SOAPFaultException.  In this 
> case, though, the SOAPFaultException will have a getDetail() element 
> that contains the detail.  Thus, it IS more information to the user.
> 
> 
> --- 
> J. Daniel Kulp
> Principal Engineer, IONA
> dkulp@apache.org
> http://www.dankulp.com/blog
> 
> 

-- 
View this message in context: http://www.nabble.com/Handling-internal-errors-via-SOAP-faults-tp15892864p19965827.html
Sent from the cxf-user mailing list archive at Nabble.com.

Re: Handling internal errors via SOAP faults

Posted by Glen Mazza <gl...@gmail.com>.
My example here: http://www.jroller.com/gmazza/date/20080308#MTstep10 does
display error details.

HTH,
Glen


Milan Doshi wrote:
> 
> We have defined a :
> <br>
> 1. User Defined Exception.<br>
> 2. There is a Fault element defined in WSDL.<br>
> 3. The WSDL2Java geneartes a valid anotations.<br>
> 
> HOWEVER, when we send back a Fault to the client, it is ONLY a SOAPFault
> with errorMessage. No DETAIL ELEMENT is present...:(. hence our user
> specific info is completely missing!!!
> <br><br>
> Can you please guide ?<br>
> <br>
> We are using :<br>
> Document / Literal.<br>
> CXF2.1.2<br>
> JDK1.5_16<br>
> <br><br>
> Any help appreciated!<br>
> 
> Thanks,<br>
> Milan
> 
> 
> 
> 
> dkulp wrote:
>> 
>> On Friday 07 March 2008, David CastaƱeda wrote:
>>> Glen, I have been fighting against this sort of questions from several
>>> weeks now,
>>>
>>> I start a sample project that is on Jira about correct handling,
>>> unfortunately I haven't found an answer from someone who know, neither
>>> I have found the way to produce correct code for server, client
>>> faults.
>>>
>>> Anyway my idea, is to only expose the exception that can be handled by
>>> the client, like InvalidCountryNameFault or
>>> MaxRequestQuantityOverLimit, mark these as Client Fault, and any other
>>> exception like (RuntimeException), DBNotAvailable, etc (things client
>>> can't handle, ServiceException) as a general exception marked as
>>> Server Fault, but as I said, I haven't found the way to do this.
>> 
>> That's probably because the spec specifically does not allow for them.  
>> I've looked at the sample in the JIRA and there will be no way to do it, 
>> per spec.  Basically, undeclared exceptions are all to be treated as 
>> generic runtime exceptions and mapped, per spec, to a relatively 
>> generice soap:fault on the wire and then to a SOAPFaultException on the 
>> client side.  If you want properly typed exceptions, you HAVE to put 
>> them on the SEI interface methods.  
>> 
>> Using some JAX-WS/JAXB "tricks", you can control the on-the-wire 
>> representation of the exception a little more, but that won't stop it 
>> from being mapped to a generic SOAPFaultException on the client side.  
>> 
>> For example, if we take your sample from CXF-1434 and change the 
>> UncheckedWrongTextException to look like:
>> 
>> @WebFault(name = "UncheckedWrongTextException")
>> public class UncheckedWrongTextException extends RuntimeException {
>>     UncheckedWrongText i;
>>     public UncheckedWrongTextException(String msg) {
>>         super(msg);
>>         i = new UncheckedWrongText();
>>         i.setMessage(msg);
>>     }
>>     public UncheckedWrongTextException(String msg, int t) {
>>         super(msg);
>>         i = new UncheckedWrongText();
>>         i.setMessage(msg);
>>         i.setIdx(t);
>>     }
>>     public UncheckedWrongText getFaultInfo() {
>>         return i;
>>     }
>> 
>>     @XmlRootElement
>>     public static class UncheckedWrongText {
>>         int idx;
>>         String msg;
>>         public int getIdx() {
>>             return idx;
>>         }
>>         public void setIdx(int i) {
>>             idx = i;
>>         }
>>         public void setMessage(String m) {
>>             msg = m;
>>         }
>>         public String getMessage() {
>>             return msg;
>>         }
>> 
>>     }
>> }
>> 
>> And then add to HelloWorld.java:
>> @XmlSeeAlso({UncheckedWrongTextException.UncheckedWrongText.class})
>> 
>> Then the on-the-wire fault would look like:
>> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
>>     <soap:Body>
>>         <soap:Fault>
>>             <faultcode>soap:Server</faultcode>
>>             <faultstring>Only characters are allowed</faultstring>
>>             <detail>
>>                 <ns2:uncheckedWrongText xmlns:ns2="http://spring.demo/">
>>                     <idx>0</idx>
>>                     <message>Only characters are allowed</message>
>>                 </ns2:uncheckedWrongText>
>>             </detail>
>>         </soap:Fault>
>>     </soap:Body>
>> </soap:Envelope> 
>> 
>> 
>> However, the client will still only get a SOAPFaultException.  In this 
>> case, though, the SOAPFaultException will have a getDetail() element 
>> that contains the detail.  Thus, it IS more information to the user.
>> 
>> 
>> --- 
>> J. Daniel Kulp
>> Principal Engineer, IONA
>> dkulp@apache.org
>> http://www.dankulp.com/blog
>> 
>> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Handling-internal-errors-via-SOAP-faults-tp15892864p19967156.html
Sent from the cxf-user mailing list archive at Nabble.com.