Hello guys,
I am working on WS-Eventing implementation for CXF [1], as I stated some time
earlier (it is my master's thesis). However, I need to throw faults from the
EventSource service and that introduces a problem. If a service implementation
throws an org.apache.cxf.binding.soap.SoapFault, is there any possibility to
set the WS-Addressing action associated with this Fault? Setting it through
@javax.xml.ws.Action annotation in the webservice's interface definition
doesn't seem to help - I think this annotation only affects those exceptions
which are mapped into WSDL, that means checked exceptions. However, Fault
extends a RuntimeException, so it doesn't map into WSDL and the @Action
annotation seems to ignore it.
I assume I cannot use checked exceptions, because
- according to WS-Eventing specification[2], faults thrown by EventSource /
SubscriptionManager should not be mapped into WSDL
- the SOAP output needs to be something like [3] (again, specification)
<s12:Envelope>
<s12:Header>
<wsa:Action> *****Action***** </wsa:Action>
</s12:Header>
<s12:Body>
<s12:Fault>
<s12:Code>
<s12:Value>*****Code*****</s12:Value>
<s12:Subcode>
<s12:Value>*****Subcode*****</s12:Value>
</s12:Subcode>
</s12:Code>
<s12:Reason>
<s12:Text xml:lang="en">*****Reason*****</s12:Text>
</s12:Reason>
<s12:Detail>
*****Detail*****
</s12:Detail>
</s12:Fault>
</s12:Body>
</s12:Envelope>
which I am not sure if this is possible to accomplish without throwing
org.apache.cxf.binding.soap.SoapFault.
So far, I have used a bit of a hack, introducing an additional SoapInterceptor
[4], which does the work of setting the WSA action, when a SoapFault is thrown.
But that hack introduces unwanted complexity and code unclarity (I also need a
new Feature to apply this interceptor). I would like to get rid of that, if it
is possible to do it a better way, preferably without too much CXF internal API.
Thanks for any suggestions (if you have any) :)
Jan
(from Red Hat)
[1] https://github.com/jmartisk/cxf/tree/jmartisk-devel/rt/ws/eventing
[2] http://www.w3.org/TR/ws-eventing/
[3] http://www.w3.org/TR/ws-eventing/#Faults
[4]
https://github.com/jmartisk/cxf/blob/jmartisk-devel/rt/ws/eventing/src/main/java/org/apache/cxf/ws/eventing/shared/faulthandling/EventingFaultHandler.java