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.

Reply via email to