ODE
  1. ODE
  2. ODE-264

Catch fault mapping doesn't fulfill specification

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Won't Fix
    • Affects Version/s: 1.1.1
    • Fix Version/s: 1.2
    • Component/s: BPEL Runtime
    • Labels:
      None
    • Environment:
      FUSE ESB 3.3.0.2

      Description

      In one my wsdls I have:

      <message name="LowLevelServiceFault">
      <part name="body" element="soap-env:Fault"/>
      </message>
      <portType name="SomeServicePortType">
      <operation name="SomeServiceRQ">
      <input message="tns:SomeServiceInput"/>
      <output message="tns:SomeServiceOutput"/>
      <fault name="LowLevelServiceError" message="tns:LowLevelServiceFault"/>
      </operation>
      </portType>

      After invoke I've got fault message so I would like to catch fault using:

      <bpel:catch faultName="tns:LowLevelServiceError" faultVariable="LowLevelServiceFaultVariable" faultElement="soap-env:Fault">

      but it doesn't work.
      According to specification is should work (Web Services Business Process Execution Language Version 2.0 OASIS Standard11 April 2007, paragraph 12.5. Fault Handlers):

      In the case of faults thrown with associated data the fault MUST be caught as follows:
      1. If there is a <catch> construct with a matching faultName value that has a faultVariable whose type matches the type of the runtime fault data then the fault is passed to the identified <catch> construct (see the matching criteria definition below).
      2. Otherwise if the fault data is a WSDL message type where the message contains a single part defined by an element and there exists a <catch> construct with a matching faultName value that has a faultVariable whose associated faultElement's QName matches the QName of the runtime element data of the single WSDL message part, then the fault is passed to the identified <catch> construct with the faultVariable initialized to the value in the single part's element (see the matching criteria definition below).

      so according to the specification LowLevelServiceFaultVariable should be initialized using "body" part.

      Fortunately such catch works:
      <bpel:catch faultName="tns:LowLevelServiceError" faultVariable="LowLevelServiceFaultVariable" faultMessageType="tns:LowLevelServiceFault">

        Activity

        Hide
        Mateusz Nowakowski added a comment -

        As I mentioned we solved this problem using

        <bpel:catch faultName="tns:LowLevelServiceError" faultVariable="LowLevelServiceFaultVariable" faultMessageType="tns:LowLevelServiceFault"> where tns:LowLevelServiceFault is declared as

        <message name="LowLevelServiceFault">
        <part name="body" element="soap-env:Fault"/>
        </message>

        and using static routing sleep and xslt service units before entering ode we make sure that ode gets from ServiceMix an xml which contains only <soap-env:Fault> and it works somehow.....

        I think I can close this entry and open enhancement about it

        Show
        Mateusz Nowakowski added a comment - As I mentioned we solved this problem using <bpel:catch faultName="tns:LowLevelServiceError" faultVariable="LowLevelServiceFaultVariable" faultMessageType="tns:LowLevelServiceFault"> where tns:LowLevelServiceFault is declared as <message name="LowLevelServiceFault"> <part name="body" element="soap-env:Fault"/> </message> and using static routing sleep and xslt service units before entering ode we make sure that ode gets from ServiceMix an xml which contains only <soap-env:Fault> and it works somehow..... I think I can close this entry and open enhancement about it
        Hide
        Matthieu Riou added a comment -

        Catching the whole soap-env:Fault element is not supported in BPEL. We could add some special treatment for it based on the type declared but right now we don't support it either.

        Show
        Matthieu Riou added a comment - Catching the whole soap-env:Fault element is not supported in BPEL. We could add some special treatment for it based on the type declared but right now we don't support it either.
        Hide
        Mateusz Nowakowski added a comment -

        Any comment to my last comment ?

        Show
        Mateusz Nowakowski added a comment - Any comment to my last comment ?
        Hide
        Mateusz Nowakowski added a comment -

        So when I've got soap-env:Fault message ODE give me only <details> of soap-env:Fault element ?
        But <details> tag is optional in <soap-enfvFault> element and I need access to <faultcode> and <faultmessage> from <soap-env:Fault> element which are required in schema ?

        How to get access to whole soap-en:Fault ?

        BTW my previous approach with
        <bpel:catch faultName="tns:LowLevelServiceError" faultVariable="LowLevelServiceFaultVariable" faultMessageType="tns:LowLevelServiceFault">
        works and I've got whole <soap-env:Fault> message.

        Show
        Mateusz Nowakowski added a comment - So when I've got soap-env:Fault message ODE give me only <details> of soap-env:Fault element ? But <details> tag is optional in <soap-enfvFault> element and I need access to <faultcode> and <faultmessage> from <soap-env:Fault> element which are required in schema ? How to get access to whole soap-en:Fault ? BTW my previous approach with <bpel:catch faultName="tns:LowLevelServiceError" faultVariable="LowLevelServiceFaultVariable" faultMessageType="tns:LowLevelServiceFault"> works and I've got whole <soap-env:Fault> message.
        Hide
        Matthieu Riou added a comment -

        Your part element probably shouldn't be the soap-env:Fault wrapper but "the runtime element data of the single WSDL message part". WSDL faults have their own element type which are usually included in the <details> element of the SOAP message. So you should probably have something like:

        <message name="LowLevelServiceFault">
        <part name="body" element="tns:myFaultElmt"/>
        </message>
        <portType name="SomeServicePortType">
        <operation name="SomeServiceRQ">
        <input message="tns:SomeServiceInput"/>
        <output message="tns:SomeServiceOutput"/>
        <fault name="LowLevelServiceError" message="tns:LowLevelServiceFault"/>
        </operation>
        </portType>

        ...

        <bpel:catch faultName="tns:LowLevelServiceError" faultVariable="LowLevelServiceFaultVariable" faultElement="tns:myFaultElmt">

        Show
        Matthieu Riou added a comment - Your part element probably shouldn't be the soap-env:Fault wrapper but "the runtime element data of the single WSDL message part". WSDL faults have their own element type which are usually included in the <details> element of the SOAP message. So you should probably have something like: <message name="LowLevelServiceFault"> <part name="body" element="tns:myFaultElmt"/> </message> <portType name="SomeServicePortType"> <operation name="SomeServiceRQ"> <input message="tns:SomeServiceInput"/> <output message="tns:SomeServiceOutput"/> <fault name="LowLevelServiceError" message="tns:LowLevelServiceFault"/> </operation> </portType> ... <bpel:catch faultName="tns:LowLevelServiceError" faultVariable="LowLevelServiceFaultVariable" faultElement="tns:myFaultElmt">

          People

          • Assignee:
            Unassigned
            Reporter:
            Mateusz Nowakowski
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development