You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Antoine Roux <an...@net-vitesse.com> on 2009/09/07 16:06:19 UTC

Multiple faults not recognized

 Hi,
I develop a contract first web service. I want to be able to send two
different kinds of SOAP faults for one of my operations. But on the client
side, when an exception is thrown, I get a SOAPFaultException and not my own
exceptions defined in my WSDL.

When I used only one fault for my service, it worked well, but not with two
faults.

Here is how it is defined in the WSDL for now:

<xsd:element name="LoginFault">
          <xsd:complexType>
              <xsd:sequence>
                  <xsd:element name="message" type="xsd:string"
maxOccurs="1" minOccurs="1"></xsd:element>
                  <xsd:element name="code" type="xsd:int" maxOccurs="1"
minOccurs="0"></xsd:element>
              </xsd:sequence>
          </xsd:complexType>
      </xsd:element>

      <xsd:element name="MaxUsersFault">
          <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="message" type="xsd:string" maxOccurs="1"
minOccurs="1"></xsd:element>
            </xsd:sequence>
          </xsd:complexType>
      </xsd:element>

[...]

<wsdl:message name="login_faultMsg">
      <wsdl:part name="parameters" element="tns:LoginFault"></wsdl:part>
</wsdl:message>
  <wsdl:message name="maxUsers_faultMsg">
      <wsdl:part name="parameters" element="tns:MaxUsersFault"></wsdl:part>
  </wsdl:message>

[...]

<wsdl:operation name="login">
      <wsdl:input message="tns:loginRequest"/>
      <wsdl:output message="tns:loginResponse"/>
      <wsdl:fault name="fault" message="tns:login_faultMsg"></wsdl:fault>
      <wsdl:fault name="maxUsersFault"
message="tns:maxUsers_faultMsg"></wsdl:fault>
</wsdl:operation>

I generate the code for both client and server using wsdl2java.

On server side, I do:
LoginFault fault = new LoginFault();
fault.setMessage("some message");
throw new LoginFaultMsg("Could not log in", fault);

But On the client side, I can only catch a SOAPFaultException, not a
LoginFaultMsg :o(

Here is an example of the SOAP message sent over the wire:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"<http://schemas.xmlsoap.org/soap/envelope/>><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Could
not log in</faultstring><detail><ns2:LoginFault xmlns:ns2=
"http://www.net-vitesse.com/login/loginService/"<http://www.net-vitesse.com/login/loginService/>><message>Some
message</message></ns2:LoginFault></detail></soap:Fault></soap:Body></soap:Envelope>

Do you have any idea what could go wrong?
How does CXF knows what is the type of exception that is thrown ? It seems
it cannot recognize it.

Thanks.


--
Antoine Roux,
NetVitesse S.A.R.L
antoine.roux@net-vitesse.com
Phone: +33 (0)1 61 37 04 24
Mobile: +33 (0)6 20 69 07 96

Re: Multiple faults not recognized

Posted by Antoine Roux <an...@net-vitesse.com>.
I forgot to mention I am using CXF 2.2.1 on both client and server side.




On Mon, Sep 7, 2009 at 4:06 PM, Antoine Roux
<an...@net-vitesse.com>wrote:

> Hi,
> I develop a contract first web service. I want to be able to send two
> different kinds of SOAP faults for one of my operations. But on the client
> side, when an exception is thrown, I get a SOAPFaultException and not my own
> exceptions defined in my WSDL.
>
> When I used only one fault for my service, it worked well, but not with two
> faults.
>
> Here is how it is defined in the WSDL for now:
>
> <xsd:element name="LoginFault">
>           <xsd:complexType>
>               <xsd:sequence>
>                   <xsd:element name="message" type="xsd:string"
> maxOccurs="1" minOccurs="1"></xsd:element>
>                   <xsd:element name="code" type="xsd:int" maxOccurs="1"
> minOccurs="0"></xsd:element>
>               </xsd:sequence>
>           </xsd:complexType>
>       </xsd:element>
>
>       <xsd:element name="MaxUsersFault">
>           <xsd:complexType>
>             <xsd:sequence>
>                 <xsd:element name="message" type="xsd:string" maxOccurs="1"
> minOccurs="1"></xsd:element>
>             </xsd:sequence>
>           </xsd:complexType>
>       </xsd:element>
>
> [...]
>
> <wsdl:message name="login_faultMsg">
>       <wsdl:part name="parameters" element="tns:LoginFault"></wsdl:part>
> </wsdl:message>
>   <wsdl:message name="maxUsers_faultMsg">
>       <wsdl:part name="parameters" element="tns:MaxUsersFault"></wsdl:part>
>   </wsdl:message>
>
> [...]
>
> <wsdl:operation name="login">
>       <wsdl:input message="tns:loginRequest"/>
>       <wsdl:output message="tns:loginResponse"/>
>       <wsdl:fault name="fault" message="tns:login_faultMsg"></wsdl:fault>
>       <wsdl:fault name="maxUsersFault"
> message="tns:maxUsers_faultMsg"></wsdl:fault>
> </wsdl:operation>
>
> I generate the code for both client and server using wsdl2java.
>
> On server side, I do:
> LoginFault fault = new LoginFault();
> fault.setMessage("some message");
> throw new LoginFaultMsg("Could not log in", fault);
>
> But On the client side, I can only catch a SOAPFaultException, not a
> LoginFaultMsg :o(
>
> Here is an example of the SOAP message sent over the wire:
> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"<http://schemas.xmlsoap.org/soap/envelope/>><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Could
> not log in</faultstring><detail><ns2:LoginFault xmlns:ns2=
> "http://www.net-vitesse.com/login/loginService/"<http://www.net-vitesse.com/login/loginService/>><message>Some
> message</message></ns2:LoginFault></detail></soap:Fault></soap:Body></soap:Envelope>
>
> Do you have any idea what could go wrong?
> How does CXF knows what is the type of exception that is thrown ? It seems
> it cannot recognize it.
>
> Thanks.
>
>
> --
> Antoine Roux,
> NetVitesse S.A.R.L
> antoine.roux@net-vitesse.com
> Phone: +33 (0)1 61 37 04 24
> Mobile: +33 (0)6 20 69 07 96
>

Re: Multiple faults not recognized

Posted by Daniel Kulp <dk...@apache.org>.
I think that all looks correct.   Not sure why that isn't working.

Is there any chance you could package it up into a small sample that shows it 
not working and log a JIRA?  Having the full sample (with schemas and wsdl's 
and such) can help figure out what it going on.

Dan


On Mon September 7 2009 10:06:19 am Antoine Roux wrote:
>  Hi,
> I develop a contract first web service. I want to be able to send two
> different kinds of SOAP faults for one of my operations. But on the client
> side, when an exception is thrown, I get a SOAPFaultException and not my
>  own exceptions defined in my WSDL.
> 
> When I used only one fault for my service, it worked well, but not with two
> faults.
> 
> Here is how it is defined in the WSDL for now:
> 
> <xsd:element name="LoginFault">
>           <xsd:complexType>
>               <xsd:sequence>
>                   <xsd:element name="message" type="xsd:string"
> maxOccurs="1" minOccurs="1"></xsd:element>
>                   <xsd:element name="code" type="xsd:int" maxOccurs="1"
> minOccurs="0"></xsd:element>
>               </xsd:sequence>
>           </xsd:complexType>
>       </xsd:element>
> 
>       <xsd:element name="MaxUsersFault">
>           <xsd:complexType>
>             <xsd:sequence>
>                 <xsd:element name="message" type="xsd:string" maxOccurs="1"
> minOccurs="1"></xsd:element>
>             </xsd:sequence>
>           </xsd:complexType>
>       </xsd:element>
> 
> [...]
> 
> <wsdl:message name="login_faultMsg">
>       <wsdl:part name="parameters" element="tns:LoginFault"></wsdl:part>
> </wsdl:message>
>   <wsdl:message name="maxUsers_faultMsg">
>       <wsdl:part name="parameters" element="tns:MaxUsersFault"></wsdl:part>
>   </wsdl:message>
> 
> [...]
> 
> <wsdl:operation name="login">
>       <wsdl:input message="tns:loginRequest"/>
>       <wsdl:output message="tns:loginResponse"/>
>       <wsdl:fault name="fault" message="tns:login_faultMsg"></wsdl:fault>
>       <wsdl:fault name="maxUsersFault"
> message="tns:maxUsers_faultMsg"></wsdl:fault>
> </wsdl:operation>
> 
> I generate the code for both client and server using wsdl2java.
> 
> On server side, I do:
> LoginFault fault = new LoginFault();
> fault.setMessage("some message");
> throw new LoginFaultMsg("Could not log in", fault);
> 
> But On the client side, I can only catch a SOAPFaultException, not a
> LoginFaultMsg :o(
> 
> Here is an example of the SOAP message sent over the wire:
> <soap:Envelope
>  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"<http://schemas.xmls
> oap.org/soap/envelope/>><soap:Body><soap:Fault><faultcode>soap:Server</faul
> tcode><faultstring>Could not log in</faultstring><detail><ns2:LoginFault
>  xmlns:ns2=
> "http://www.net-vitesse.com/login/loginService/"<http://www.net-vitesse.com
> /login/loginService/>><message>Some
>  message</message></ns2:LoginFault></detail></soap:Fault></soap:Body></soap
> :Envelope>
> 
> Do you have any idea what could go wrong?
> How does CXF knows what is the type of exception that is thrown ? It seems
> it cannot recognize it.
> 
> Thanks.
> 
> 
> --
> Antoine Roux,
> NetVitesse S.A.R.L
> antoine.roux@net-vitesse.com
> Phone: +33 (0)1 61 37 04 24
> Mobile: +33 (0)6 20 69 07 96
> 

-- 
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog