Thanks Sergey! 
I have almost put it together at this point.
One thing that wasn't immediately clear is that the exception mapper is "a
provider"
and can be registered as follows (makes sense to add to the same wiki
page?):

                <jaxrs:providers>
                        <ref bean="restCustomExceptionMapperProvider"/>
                </jaxrs:providers>

Thanks,
-Vitaly


Sergey Beryozkin-2 wrote:
> 
> Hi
> 
> I updated the exception handling section with few extra details, I added a
> link to a simple exception mapper used by Spring Security 
> tests and also linked to a custom CXF out fault interceptor.
> So in summary here're the options for catching all the exceptions :
> - register a mapper like ExceptionMapper<Throwable>
> - register a custom out Fault Interceptor
> - register a custom Servlet filter (provided that the propogation is not
> turned off)
> 
> Finally, if you'd like no exception traces reported with HTTP responses
> then just disable the propogation.
> 
>> Also, I wonder
>> if you can tell why spring AOP is not working on the CXF impls? Tried to
>> debug  it, but have no clear picture yet. It seems like injection hicks
>> up
>> on the wsContext member of the base class of my Impl class.
> 
>>>         ... 39 more
>>> Caused by: java.lang.IllegalArgumentException
>>>         at
>>> sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java
>>> :37)
>>>         at
>>> sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImp
> 
> This exception trace looks similar. If you have a JAXWS WebServiceContext
> field then use a setter instead. Similarly for JAXRS 
> MessageContext
> 
> hope it helps, Sergey
> 
>>
>> Hi Mustafa!
>> Yes, I need to be able to have a centrally controller backstop for all
>> exceptions coming out of my mackages, mostly .*Impl classes and custom
>> interceptors such as i.e. Auth interceptor. Soap already kind of does it
>> for
>> me by wrapping it into a generic Fault (I actually wanted MyException
>> class
>> instead, but I can live with Fault for unexpected errors on the Soap
>> side.
>> The jaxrs REST side behaves differently by exposing full stack traces,
>> which
>> is what I don't want clients to see - there is log file for that
>> purpose..
>> The mapper sounds like what I could use, do you have an example how to
>> intercept or map a Exception and rethrow MyException instead? Also, I
>> wonder
>> if you can tell why spring AOP is not working on the CXF impls? Tried to
>> debug  it, but have no clear picture yet. It seems like injection hicks
>> up
>> on the wsContext member of the base class of my Impl class.
>>
>>
>>
>> Mustafa Sezgin-2 wrote:
>>>
>>> From my understanding you basically want a centralised place to handle
>>> exceptions and a way to control what is returned to the client? We use
>>> an
>>> exception mapper which receives all possible exceptions and you can then
>>> return the desired response object based on the exception. We have a
>>> many
>>> to one mapping between exceptions and the status codes we return in XML
>>> format and are able to handle all exceptions ensuring that not undesired
>>> responses get sent back to the client.
>>>
>>> Have a look at
>>> http://cwiki.apache.org/CXF20DOC/jax-rs.html#JAX-RS-Exceptionhandling
>>>
>>> -----Original Message-----
>>> From: vickatvuuch [mailto:vlisov...@gmail.com]
>>> Sent: Tuesday, 17 November 2009 9:30 AM
>>> To: users@cxf.apache.org
>>> Subject: CXF jaxrs REST exception stack trace propagated to REST client,
>>> can exception be wrapped up or filtered out or AOP intercepted?
>>>
>>>
>>> Hi All,
>>>
>>> Is there a way to Not propagate unchecked exception stack traces back to
>>> the
>>> client?
>>>
>>> Use case: I have a port, that expects certain parameters, if one of them
>>> is
>>> null
>>> it may throw unchecked IllegalArgumentException, which could be
>>> rectified
>>> if
>>> it was
>>> all under my control.
>>>
>>> Imagine that other team members adding new ports and not wrapping it up
>>> completely.
>>> What I wanted was to have a way to control what goes out to the client
>>> hopefully in one place.
>>>
>>> For instance I have defined WSBaseException from which all other WS
>>> layer
>>> exceptions
>>> should be derived and thrown out of the WS layer (annotated with
>>> WebFault).
>>>
>>> First thing I did, I tried try AOP "after-throwing" pointcut, which is
>>> where
>>> I was hoping to intercept all outgoing exceptions and wrap them up in
>>> the
>>> WSBaseException for anything
>>> that would come out unless it was already WSBaseException, but that
>>> didn't
>>> work,  still debugging why it fails, btw AOP config and exception is
>>> below:
>>> But my question is mostly about how to do this without
>>> extra AOP, does CXF has a way of dealing with this situation already,
>>> may
>>> be
>>> I'm missing something?
>>> Thanks,
>>> -Vitaly
>>>
>>> <bean id="wsExceptionInterceptorAspect"
>>> class="com.foo.webservices.v1.WSExceptionTranslator"/>
>>>
>>>   <aop:config>
>>>     <aop:pointcut id="wsServiceOperation"
>>>     expression="execution(*
>>> com.foo.webservices.v1.ports.auth.MyServiceImpl*.(..))"/>
>>>
>>>     <aop:aspect id="wsAfterThrowing" ref="wsExceptionInterceptorAspect">
>>>       <aop:after-throwing pointcut-ref="wsServiceOperation"
>>> throwing="exception" method="afterThrowing"/>
>>>     </aop:aspect>
>>>   </aop:config>
>>>
>>> The above blows up on server startup, when it is loading the Imlp on
>>> which
>>> I
>>> have a pointcut:
>>>
>>> jaxws.EndpointImpl---1853031827,org.apache.cxf.jaxrs.spring.JAXRSServerFac
>>> toryBeanDefinitionParser$SpringJAXRSServerFact
>>> oryBean--1917449182,org.apache.cxf.jaxws.EndpointImpl--1050608923,org.apac
>>> he.cxf.jaxws.EndpointImpl--880314741,wsExcepti
>>> onInterceptorAspect,org.springframework.aop.config.internalAutoProxyCreato
>>> r,wsServiceOperation,org.springframework.aop.a
>>> spectj.AspectJPointcutAdvisor#0]; root of factory hierarchy
>>> - Context initialization failed
>>> org.springframework.beans.factory.BeanCreationException: Error creating
>>> bean
>>> with name 'org.apache.cxf.jaxws.EndpointImp
>>> l---1687321673': Invocation of init method failed; nested exception is
>>> javax.xml.ws.WebServiceException: Creation of End
>>> point failed
>>>         at
>>> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
>>> ry.initializeBean(AbstractAutowireC
>>> apableBeanFactory.java:1338)
>>>         at
>>> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
>>> ry.doCreateBean(AbstractAutowireCap
>>> ableBeanFactory.java:473)
>>>         at
>>> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
>>> ry$1.run(AbstractAutowireCapableBea
>>> nFactory.java:409)
>>>         at java.security.AccessController.doPrivileged(Native Method)
>>>         at
>>> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
>>> ry.createBean(AbstractAutowireCapab
>>> leBeanFactory.java:380)
>>>         at
>>> org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(
>>> AbstractBeanFactory.java:264)
>>>         at
>>> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.get
>>> Singleton(DefaultSingletonBeanRegis
>>> try.java:222)
>>>         at
>>> org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(Ab
>>> stractBeanFactory.java:261)
>>>         at
>>> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(Abst
>>> ractBeanFactory.java:185)
>>>         at
>>> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(Abst
>>> ractBeanFactory.java:164)
>>>         at
>>> org.springframework.beans.factory.support.DefaultListableBeanFactory.preIn
>>> stantiateSingletons(DefaultListable
>>> BeanFactory.java:429)
>>>         at
>>> org.springframework.context.support.AbstractApplicationContext.finishBeanF
>>> actoryInitialization(AbstractApplic
>>> ationContext.java:728)
>>>         at
>>> org.springframework.context.support.AbstractApplicationContext.refresh(Abs
>>> tractApplicationContext.java:380)
>>>         at
>>> org.springframework.web.context.ContextLoader.createWebApplicationContext(
>>> ContextLoader.java:255)
>>>         at
>>> org.springframework.web.context.ContextLoader.initWebApplicationContext(Co
>>> ntextLoader.java:199)
>>>         at
>>> org.springframework.web.context.ContextLoaderListener.contextInitialized(C
>>> ontextLoaderListener.java:45)
>>>         at
>>> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.jav
>>> a:3934)
>>>         at
>>> org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)
>>>         at
>>> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java
>>> :791)
>>>         at
>>> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
>>>         at
>>> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526)
>>>         at
>>> org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:850)
>>>         at
>>> org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:724)
>>>         at
>>> org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:493)
>>>         at
>>> org.apache.catalina.startup.HostConfig.start(HostConfig.java:1206)
>>>         at
>>> org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314)
>>>         at
>>> org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupp
>>> ort.java:119)
>>>         at
>>> org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
>>>         at
>>> org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
>>>         at
>>> org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
>>>         at
>>> org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
>>>         at
>>> org.apache.catalina.core.StandardService.start(StandardService.java:516)
>>>         at
>>> org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
>>>         at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
>>>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>         at
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
>>> 39)
>>>         at
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorIm
>>> pl.java:25)
>>>         at java.lang.reflect.Method.invoke(Method.java:585)
>>>         at
>>> org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
>>>         at
>>> org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
>>> Caused by: javax.xml.ws.WebServiceException: Creation of Endpoint failed
>>>         at
>>> org.apache.cxf.jaxws.JaxWsServerFactoryBean.init(JaxWsServerFactoryBean.ja
>>> va:181)
>>>         at
>>> org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.
>>> java:168)
>>>         at
>>> org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:346)
>>>         at
>>> org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:259)
>>>         at
>>> org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:209)
>>>         at
>>> org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:404)
>>>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>         at
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
>>> 39)
>>>         at
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorIm
>>> pl.java:25)
>>>         at java.lang.reflect.Method.invoke(Method.java:585)
>>>         at
>>> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
>>> ry.invokeCustomInitMethod(AbstractA
>>> utowireCapableBeanFactory.java:1414)
>>>         at
>>> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
>>> ry.invokeInitMethods(AbstractAutowi
>>> reCapableBeanFactory.java:1375)
>>>         at
>>> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto
>>> ry.initializeBean(AbstractAutowireC
>>> apableBeanFactory.java:1335)
>>>         ... 39 more
>>> Caused by: java.lang.IllegalArgumentException
>>>         at
>>> sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java
>>> :37)
>>>         at
>>> sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImp
>>> l.java:57)
>>>         at java.lang.reflect.Field.set(Field.java:656)
>>>         at
>>> org.apache.cxf.common.injection.ResourceInjector.injectField(ResourceInjec
>>> tor.java:283)
>>>         at
>>> org.apache.cxf.common.injection.ResourceInjector.visitField(ResourceInject
>>> or.java:167)
>>>         at
>>> org.apache.cxf.common.annotation.AnnotationProcessor.processFields(Annotat
>>> ionProcessor.java:101)
>>>         at
>>> org.apache.cxf.common.annotation.AnnotationProcessor.processFields(Annotat
>>> ionProcessor.java:95)
>>>         at
>>> org.apache.cxf.common.annotation.AnnotationProcessor.accept(AnnotationProc
>>> essor.java:69)
>>>         at
>>> org.apache.cxf.common.injection.ResourceInjector.inject(ResourceInjector.j
>>> ava:81)
>>>         at
>>> org.apache.cxf.jaxws.JaxWsServerFactoryBean.injectResources(JaxWsServerFac
>>> toryBean.java:221)
>>>         at
>>> org.apache.cxf.jaxws.JaxWsServerFactoryBean.init(JaxWsServerFactoryBean.ja
>>> va:175)
>>>         ... 51 more
>>> Nov 16, 2009 5:23:23 PM org.apache.catalina.core.StandardContext start
>>> -- 
>>> View this message in context:
>>> http://old.nabble.com/CXF-jaxrs-REST-exception-stack-trace-propagated-to-R
>>> EST-client%2C-can-exception-be-wrapped-up-or-filtered-out-or-AOP-intercept
>>> ed--tp26379915p26379915.html
>>> Sent from the cxf-user mailing list archive at Nabble.com.
>>>
>>>
>>>
>>
>> -- 
>> View this message in context: 
>> http://old.nabble.com/CXF-jaxrs-REST-exception-stack-trace-propagated-to-REST-client%2C-can-exception-be-wrapped-up-or-filtered-out-or-AOP-intercepted--tp26379915p26384165.html
>> Sent from the cxf-user mailing list archive at Nabble.com.
>> 
> 
> 
> 

-- 
View this message in context: 
http://old.nabble.com/CXF-jaxrs-REST-exception-stack-trace-propagated-to-REST-client%2C-can-exception-be-wrapped-up-or-filtered-out-or-AOP-intercepted--tp26379915p26393983.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to