Affects Version/s: 3.2.6
Fix Version/s: None
Component/s: JAX-WS Runtime
According to JAX-WS 2.3 spec (section 188.8.131.52), the async binding differs from the sync binding in the handling of in-out and out parameters, namely:
- Out: The part or wrapper child is mapped to a property of the response bean.
- In/Out: The part or wrapper child is mapped to a method parameter (no holder class) and to a property of the response bean.
In our project we are deploying our services on Weblogic, which includes Metro (JAX-WS RI) as JAX-WS implementation. And that requires the above signature for the async binding to work. However, CXF does not behave the same way: it expects the same input parameters in both bindings (sync and async); that means we still have the Holder class and no ResponseBean.
As a result, we cannot have the same, portable JAX-WS client that can be used either with Metro or CXF, which is what we are striving for...
Take for example, the following WSDL. Note that there are two In-Out SOAP headers, along with the body.
...and, as described above, the mapping to Java differs for Metro and CXF:
In addition, CXF does not behave as required by the JAX-WS spec when an exception is thrown in "async" mode. The cause of ExecutionException is the inner exception, typically a checked one (such as ConnectException), instead of the required unchecked WebServiceException. This is mandated in section 4.3.3 of the spec:
♦ Conformance (Reporting asynchronous errors): If the operation invocation fails, an implementation MUST throw a java.util.concurrent.ExecutionException from the Response.get method. The cause of an ExecutionException is the original exception raised. In the case of a Response instance this can only be a WebServiceException or one of its subclasses
Thank you in advance.