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)

Reply via email to