Hello, I've been facing the following issue for the last two days and I can't find that's wrong with my config (using CXF 2.2.3 with Spring 2.5) :
I have regsitered 2 ExceptionMappers that should intercept some custom checked exceptions that my service bean may throw. These exceptions are authentication related. For now, the Exception Mappers are not called, and on the browser side, I get 500 errors pages with (ugly) stacktraces, instead of 403 errors pages with a custom message. I'd like to use the exception mappers to be able to handle any king of exceptions (those checked exceptions and later any other runtime exception with custom messages), instead of having try/catch blocks everywhere with WebApplicationException wrappers. Code would remain cleaner and lighter ;-) Here are my config files and classes: web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:META-INF/spring*Context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <display-name>CXF Servlet</display-name> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> spring config file (named springCXFContext.xml): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd http://cxf.apache.org/core http://cxf.apache.org/schemascore.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <jaxrs:server id="alertesService" address="/"> <jaxrs:features> <cxf:logging /> </jaxrs:features> <jaxrs:serviceBeans> <ref bean="alertesServiceBean" /> </jaxrs:serviceBeans> <jaxrs:providers > <bean class="org.apache.cxf.jaxrs.provider.AtomFeedProvider" /> <ref bean="forbiddenOfficineExceptionMapper" /> <ref bean="forbiddenLGOExceptionMapper" /> <ref bean="genericFaultResponseExceptionMapper" /> </jaxrs:providers> </jaxrs:server> <bean id="alertesServiceBean" class="x.y.z.AlertesService" /> <bean id="forbiddenOfficineExceptionMapper" class="x.y.z.provider.ForbiddenOfficineExceptionMapper" /> <bean id="forbiddenLGOExceptionMapper" class="x.y.z.provider.ForbiddenLGOExceptionMapper" /> <bean id="authenticationExceptionMapper" class="x.y.z.provider.AuthenticationExceptionMapper" /> <bean id="genericFaultResponseExceptionMapper" class="x.y.z.provider.GenericFaultResponseExceptionMapper" /> </beans> Code for ForbiddenOfficineExceptionMapper : @Provider public class ForbiddenOfficineExceptionMapper implements ExceptionMapper<ForbiddenOfficineException> { public Response toResponse(ForbiddenOfficineException e) { return Response.status(403).type(MediaType.TEXT_PLAIN).entity("...").build(); } } Code (snippet)for AlertesServiceBean : @GET @Path("/{finess}/heartbeat") @Produces("text/plain") @Transactional(readOnly = true) public Response heartbeat(@PathParam("finess") String codeFiness, @Context UriInfo ui, @Context HttpHeaders headers) throws AuthenticationException { ... } (AuthenticationException is the super class of ForbiddenOfficineException) BTW, some console messages (running on tomcat 6): 25 août 2009 16:50:30 org.apache.tomcat.util.digester.SetPropertiesRule begin ATTENTION: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server:DP-ServicesAnnexes-WS' did not find a matching property. 25 août 2009 16:50:30 org.apache.catalina.core.AprLifecycleListener init INFO: Loaded APR based Apache Tomcat Native library 1.1.14. 25 août 2009 16:50:30 org.apache.catalina.core.AprLifecycleListener init INFO: APR capabilities: IPv6 [false], sendfile [true], accept filters [false], random [true]. 25 août 2009 16:50:31 org.apache.coyote.http11.Http11AprProtocol init INFO: Initialisation de Coyote HTTP/1.1 sur http-8080 25 août 2009 16:50:31 org.apache.coyote.ajp.AjpAprProtocol init INFO: Initializing Coyote AJP/1.3 on ajp-8009 25 août 2009 16:50:31 org.apache.catalina.startup.Catalina load INFO: Initialization processed in 2603 ms 25 août 2009 16:50:32 org.apache.catalina.core.StandardService start INFO: D�marrage du service Catalina 25 août 2009 16:50:32 org.apache.catalina.core.StandardEngine start INFO: Starting Servlet Engine: Apache Tomcat/6.0.18 25 août 2009 16:50:35 org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring root WebApplicationContext ehcache configuration for cache named [org.hibernate.cache.StandardQueryCache]; using defaults. 25 août 2009 16:51:24 org.apache.cxf.endpoint.ServerImpl initDestination INFO: Setting the server's publish address to be / 25 août 2009 16:51:25 org.apache.cxf.transport.servlet.CXFServlet updateContext INFO: Load the bus with application context Console> 2009-08-25 16:51:25|INFO || AbstractApplicationContext.prepareRefresh |Refreshing org.apache.cxf.bus.spring.busapplicationcont...@17ef0a7: display name [org.apache.cxf.bus.spring.busapplicationcont...@17ef0a7]; startup date [Tue Aug 25 16:51:25 CEST 2009]; parent: org.springframework.web.context.support.xmlwebapplicationcont...@15e0c2b 25 août 2009 16:51:25 org.apache.cxf.bus.spring.BusApplicationContext getConfigResources INFO: No cxf.xml configuration file detected, relying on defaults. Console> 2009-08-25 16:51:25|INFO || AbstractApplicationContext.obtainFreshBeanFactory |Bean factory for application context [org.apache.cxf.bus.spring.busapplicationcont...@17ef0a7]: org.springframework.beans.factory.support.defaultlistablebeanfact...@32835b Console> 2009-08-25 16:51:25|DEBUG|| AbstractApplicationContext.obtainFreshBeanFactory |0 beans defined in org.apache.cxf.bus.spring.busapplicationcont...@17ef0a7: display name [org.apache.cxf.bus.spring.busapplicationcont...@17ef0a7]; startup date [Tue Aug 25 16:51:25 CEST 2009]; parent: org.springframework.web.context.support.xmlwebapplicationcont...@15e0c2b Console> 2009-08-25 16:51:25|DEBUG|| AbstractApplicationContext.initMessageSource |Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.delegatingmessagesou...@146ccac] Console> 2009-08-25 16:51:25|DEBUG|| AbstractApplicationContext.initApplicationEventMulticaster |Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.simpleapplicationeventmulticas...@1274873] Console> 2009-08-25 16:51:25|DEBUG|| AbstractApplicationContext.publishEvent |Publishing event in context [org.apache.cxf.bus.spring.busapplicationcont...@17ef0a7]: org.springframework.context.event.contextrefreshedevent[source=org.apache.cxf.bus.spring.busapplicationcont...@17ef0a7: display name [org.apache.cxf.bus.spring.busapplicationcont...@17ef0a7]; startup date [Tue Aug 25 16:51:25 CEST 2009]; parent: org.springframework.web.context.support.xmlwebapplicationcont...@15e0c2b] 25 août 2009 16:51:25 org.apache.cxf.transport.servlet.AbstractCXFServlet replaceDestinationFactory INFO: Servlet transport factory already registered 25 août 2009 16:51:26 org.apache.coyote.http11.Http11AprProtocol start INFO: D�marrage de Coyote HTTP/1.1 sur http-8080 25 août 2009 16:51:26 org.apache.coyote.ajp.AjpAprProtocol start INFO: Starting Coyote AJP/1.3 on ajp-8009 25 août 2009 16:51:26 org.apache.catalina.startup.Catalina start INFO: Server startup in 54687 ms 25 août 2009 16:51:40 org.apache.cxf.interceptor.LoggingInInterceptor logging INFO: Inbound Message ... [spring, hibernate and auth stuff occur here] ... 25 août 2009 16:51:48 org.apache.cxf.phase.PhaseInterceptorChain doIntercept INFO: Application has thrown exception, unwinding now: dp.servicesannexes.exception.ForbiddenOfficineException: L'officine n'est pas encore active 25 août 2009 16:51:49 org.apache.cxf.phase.PhaseInterceptorChain doIntercept INFO: Application has thrown exception, unwinding now: dp.servicesannexes.exception.ForbiddenOfficineException: L'officine n'est pas encore active 25 août 2009 16:51:49 org.apache.cxf.phase.PhaseInterceptorChain unwind ATTENTION: Exception in handleFault on interceptor org.apache.cxf.binding.xml.interceptor.xmlfaultoutintercep...@db19d3 org.apache.cxf.interceptor.Fault: L'officine n'est pas encore active at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:148) at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:114) at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:118) at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:78) at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:417) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269) at java.util.concurrent.FutureTask.run(FutureTask.java:123) at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37) at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:98) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236) at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:104) at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:99) at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:452) at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:159) at org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:220) at org.apache.cxf.transport.servlet.AbstractCXFServlet.doGet(AbstractCXFServlet.java:158) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at org.apache.cxf.transport.servlet.AbstractCXFServlet.service(AbstractCXFServlet.java:211) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:857) at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:565) at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1509) at java.lang.Thread.run(Thread.java:595) Caused by <root cause> Any idea why the exception is not caught by the registered ExceptionMapper ? Thank you in advance Regards, Xavier -- View this message in context: http://www.nabble.com/-JAXRS--ExceptionMappers-not-called-tp25136326p25136326.html Sent from the cxf-user mailing list archive at Nabble.com.
