I'll double check tomorrow, but I believe we have the tests involving ResponseExceptionMapper, the conversion to default exceptions only happens if no matching ResponseExceptionMapper has been detected...

Looks like a registration issue too... Any chance you can provide a test case or may be debug into it ?

Cheers, Sergey

On 15/10/14 17:39, Curtis Garman wrote:
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