I have a java 8, Spring 4.1.1, cxf 3.0.1 app where I am tring to implement a
custom ResponseExceptionMapper for all exceptions returned to my rest
client. When I start my application, everything starts fine. However even
when I start the app with DEBUG logging turned on, I see nothing related to
my exception mapper. To test the functionality, I am passing invalid creds
to the rest service I'm consuming. According to my mapper, the 403 response
should be converted to a custom AuthorizationException...however as can be
seen from my log, the 403 is being converted to a jaxrs ForbiddenException.
Can anyone help me get things wired correctly? I noticed some of the
interfaces changed between cxf 2.x and 3.x. Is there a different interface
that I should be implementing? Implementing ExceptionMapper on the service
provider side works just fine.
package test.webservice.rest.exception;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import org.apache.cxf.jaxrs.client.ResponseExceptionMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Provider
@Component("exceptionMapper")
public class CustomResponseExceptionMapper implements
ResponseExceptionMapper<Exception> {
private static final Logger LOGGER =
LoggerFactory.getLogger(CustomResponseExceptionMapper.class);
@Override
public Exception fromResponse(Response response) {
LOGGER.debug(String.format("Executing %s",
CustomResponseExceptionMapper.class));
Response.Status status =
Response.Status.fromStatusCode(response.getStatus());
LOGGER.debug(String.format("Status: %s", status.getStatusCode()));
switch (status) {
case BAD_REQUEST:
throw new
InvalidInputException(response.getHeaderString("exception"));
case UNAUTHORIZED:
throw new
AuthorizationException(response.getHeaderString("exception"));
case FORBIDDEN:
throw new
AuthorizationException(response.getHeaderString("exception"));
case NOT_FOUND:
throw new
EmptyResultDataAccessException(response.getHeaderString("exception"));
case CONFLICT:
throw new
DuplicateKeyException(response.getHeaderString("exception"));
default:
throw new
WebApplicationException(response.getHeaderString("exception"));
<?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:cxf="http://cxf.apache.org/core"
xmlns:jaxrs-client="http://cxf.apache.org/jaxrs-client"
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.xsd
http://cxf.apache.org/core
http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxrs-client
http://cxf.apache.org/schemas/jaxrs-client.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<bean id="jsonProvider"
class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
<jaxrs-client:client id="albumClient"
serviceClass="org.apache.cxf.jaxrs.client.WebClient"
address="http://localhost:8080/rest-provider/services/album"
username="test"
password="test">
<jaxrs-client:headers>
<entry key="Accept"
value="application/xml"/>
</jaxrs-client:headers>
<jaxrs-client:providers>
<ref bean="requestFilter" />
<ref bean="jsonProvider" />
<ref bean="responseFilter" />
<ref bean="exceptionMapper"
/>
</jaxrs-client:providers>
</jaxrs-client:client>
<context:component-scan
base-package="test.webservice.rest.exception" />
<context:component-scan base-package="test.webservice.rest.filter" />
<context:component-scan
base-package="test.webservice.rest.service" />
</beans>
HTTP Status 500 - Request processing failed; nested exception is
javax.ws.rs.ForbiddenException: HTTP 403 Forbidden
type Exception report
message Request processing failed; nested exception is
javax.ws.rs.ForbiddenException: HTTP 403 Forbidden
description The server encountered an internal error that prevented it from
fulfilling this request.
exception
org.springframework.web.util.NestedServletException: Request processing
failed; nested exception is javax.ws.rs.ForbiddenException: HTTP 403
Forbidden
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkSer
vlet.java:973)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java
:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.ja
va:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(Shal
lowEtagHeaderFilter.java:81)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestF
ilter.java:107)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
javax.ws.rs.ForbiddenException: HTTP 403 Forbidden
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
java.lang.reflect.Constructor.newInstance(Unknown Source)
org.apache.cxf.jaxrs.client.AbstractClient.convertToWebApplicationException(
AbstractClient.java:478)
org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:886)
org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:854)
org.apache.cxf.jaxrs.client.WebClient.invokeAndGetCollection(WebClient.java:
513)
org.apache.cxf.jaxrs.client.WebClient.getCollection(WebClient.java:589)
test.webservice.rest.service.SimpleAlbumService.findAlbums(SimpleAlbumServic
e.java:28)
test.webservice.rest.servlet.AlbumController.list(AlbumController.java:27)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown
Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(Invocab
leHandlerMethod.java:215)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForReque
st(InvocableHandlerMethod.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandle
rMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerA
dapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerA
dapter.handleInternal(RequestMappingHandlerAdapter.java:721)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.hand
le(AbstractHandlerMethodAdapter.java:83)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServl
et.java:943)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServle
t.java:877)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkSer
vlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java
:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.ja
va:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(Shal
lowEtagHeaderFilter.java:81)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestF
ilter.java:107)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
custom ResponseExceptionMapper for all exceptions returned to my rest
client. When I start my application, everything starts fine. However even
when I start the app with DEBUG logging turned on, I see nothing related to
my exception mapper. To test the functionality, I am passing invalid creds
to the rest service I'm consuming. According to my mapper, the 403 response
should be converted to a custom AuthorizationException...however as can be
seen from my log, the 403 is being converted to a jaxrs ForbiddenException.
Can anyone help me get things wired correctly? I noticed some of the
interfaces changed between cxf 2.x and 3.x. Is there a different interface
that I should be implementing? Implementing ExceptionMapper on the service
provider side works just fine.
package test.webservice.rest.exception;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import org.apache.cxf.jaxrs.client.ResponseExceptionMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Provider
@Component("exceptionMapper")
public class CustomResponseExceptionMapper implements
ResponseExceptionMapper<Exception> {
private static final Logger LOGGER =
LoggerFactory.getLogger(CustomResponseExceptionMapper.class);
@Override
public Exception fromResponse(Response response) {
LOGGER.debug(String.format("Executing %s",
CustomResponseExceptionMapper.class));
Response.Status status =
Response.Status.fromStatusCode(response.getStatus());
LOGGER.debug(String.format("Status: %s", status.getStatusCode()));
switch (status) {
case BAD_REQUEST:
throw new
InvalidInputException(response.getHeaderString("exception"));
case UNAUTHORIZED:
throw new
AuthorizationException(response.getHeaderString("exception"));
case FORBIDDEN:
throw new
AuthorizationException(response.getHeaderString("exception"));
case NOT_FOUND:
throw new
EmptyResultDataAccessException(response.getHeaderString("exception"));
case CONFLICT:
throw new
DuplicateKeyException(response.getHeaderString("exception"));
default:
throw new
WebApplicationException(response.getHeaderString("exception"));
<?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:cxf="http://cxf.apache.org/core"
xmlns:jaxrs-client="http://cxf.apache.org/jaxrs-client"
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.xsd
http://cxf.apache.org/core
http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxrs-client
http://cxf.apache.org/schemas/jaxrs-client.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<bean id="jsonProvider"
class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
<jaxrs-client:client id="albumClient"
serviceClass="org.apache.cxf.jaxrs.client.WebClient"
address="http://localhost:8080/rest-provider/services/album"
username="test"
password="test">
<jaxrs-client:headers>
<entry key="Accept"
value="application/xml"/>
</jaxrs-client:headers>
<jaxrs-client:providers>
<ref bean="requestFilter" />
<ref bean="jsonProvider" />
<ref bean="responseFilter" />
<ref bean="exceptionMapper"
/>
</jaxrs-client:providers>
</jaxrs-client:client>
<context:component-scan
base-package="test.webservice.rest.exception" />
<context:component-scan base-package="test.webservice.rest.filter" />
<context:component-scan
base-package="test.webservice.rest.service" />
</beans>
HTTP Status 500 - Request processing failed; nested exception is
javax.ws.rs.ForbiddenException: HTTP 403 Forbidden
type Exception report
message Request processing failed; nested exception is
javax.ws.rs.ForbiddenException: HTTP 403 Forbidden
description The server encountered an internal error that prevented it from
fulfilling this request.
exception
org.springframework.web.util.NestedServletException: Request processing
failed; nested exception is javax.ws.rs.ForbiddenException: HTTP 403
Forbidden
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkSer
vlet.java:973)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java
:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.ja
va:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(Shal
lowEtagHeaderFilter.java:81)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestF
ilter.java:107)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
javax.ws.rs.ForbiddenException: HTTP 403 Forbidden
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
java.lang.reflect.Constructor.newInstance(Unknown Source)
org.apache.cxf.jaxrs.client.AbstractClient.convertToWebApplicationException(
AbstractClient.java:478)
org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:886)
org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:854)
org.apache.cxf.jaxrs.client.WebClient.invokeAndGetCollection(WebClient.java:
513)
org.apache.cxf.jaxrs.client.WebClient.getCollection(WebClient.java:589)
test.webservice.rest.service.SimpleAlbumService.findAlbums(SimpleAlbumServic
e.java:28)
test.webservice.rest.servlet.AlbumController.list(AlbumController.java:27)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown
Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(Invocab
leHandlerMethod.java:215)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForReque
st(InvocableHandlerMethod.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandle
rMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerA
dapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerA
dapter.handleInternal(RequestMappingHandlerAdapter.java:721)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.hand
le(AbstractHandlerMethodAdapter.java:83)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServl
et.java:943)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServle
t.java:877)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkSer
vlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java
:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.ja
va:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(Shal
lowEtagHeaderFilter.java:81)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestF
ilter.java:107)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)