Hi Cyrille
Please see comments inline
Dear all,
I am looking at the consistency of exception handling among JAX-WS
and JAX-RS. My primary goal is to ensure cxf management metrics (JMX)
are consistent.
Here are few questions :
SERVER SIDE JAXRS EXCEPTION MAPPER
====================================
If an ExceptionMapper handles the exception :
1) The JAXRSInvoker returns a Response instead of throwing an Exception
Yes, this is for JAXRS message body writers be able to handle whatever Response
entity a given mapper might've set up.
2) Thus PhaseInterceptorChain does NOT see that an exception occurred
during the invocation
Yes
3) Thus the "Out Interceptors" are not replaced by the "Out Fault
Interceptors" and these "Out Interceptors" are called on
#handleMessage() with the outMessage (ie the response created by the
ExceptionMapper) instead of being called on #handleFaultMessage() with
the inMessage when information like the FaultMode is still holded by
the inMessage
Yes
4) Interceptors like the ResponseTimeMessageOutInterceptor who rely on
the faultMode attribute located on the Message that is being passed to
handleMessage/handleFault are lost, they don't find the information
they look for
I see...
Questions :
* Wouldn't it make sense to call the "Out Fault Interceptors" if a
JAX-RS exception is mapped to a custom response ?
Now that you suggested it, perhaps, one alternative in mapping exceptions to
exception mappers would be to
register JAX-RS specific fault interceptors which will do the mapping, instead of doing it in the JAXRSInInterceptor or
JAXRSInvoker...
So other registered fault interceptors will get their chance as well...
What complicates things a bit is that JAXRS users can have ResponseHandler filteres registered which can override the
ExceptionMapper responses...
* which message should be given to the handleFaultMessage() ? The
inMessage that caused the exception and that holds the exception as an
attribute (it would be consistent with JAX-WS) or the outMessage as
currently done ?
Perhaps we should consider introducing JAXRS fault interceptors ? They will do Exception Mapping and abort the chain if the mapping
has been found ? I'm not yet sure how feasible and/or sensitive such a change might be, but may be it will be the right step forward
CLIENT SIDE JAXRS EXCEPTION HANDLING
=============================================
ClientProxyImpl handles exceptions after calling the interceptors
when, with JAX-WS, exception handling (CheckFaultInterceptor) is
performed in the POST_PROTOCOL phase.
Due to this, the "In Interceptors Chain" is called instead of the "In
Fault Interceptors Chain" and interceptors like
ResponseTimeMessageInInterceptor don't see the Response as an
exception.
Question :
Can we imagine to refactor jaxrs client side exception handling as a
post protocol interceptor ?
The client side needs some refactoring going forward....Some of its code would definitely need to be moved to some isolated
interceptors. However, please see JAXRSSoapBookTest, Eamonn did quite a few tests with faulty features/interceptors/server faults...
I hope this email was not too long ; it took me few hours to check all
these use cases and figure out how it worked :-)
No problems :-), please type as long a message as you'd like to :-), thanks for
starting this thread
cheers, Sergey
Cyrille
--
Cyrille Le Clerc
clecl...@xebia.fr