I did a little debugging and have discovered that
org.apache.cxf.jaxrs.client.WebClient does not seem to look for a
ResponseExceptionMapper. The doInvoke() method (around line 885) simply
looks at the response status returned and throws an error for status > 300.
However, the org.apache.cxf.jaxrs.client. ClientProxyImpl has a
checkResponse method that actually checks for a custom mapper. The doc seems
to make me think that whether I'm using the WebClient or a proxy, I should
be able to deal with exceptions in the same way. Is this supposed to be
true?

-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]] 
Sent: Wednesday, October 15, 2014 4:06 PM
To: [email protected]
Subject: Re: Trouble configuring custom ResponseExceptionMapper

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(Framew
> orkSer
> vlet.java:973)
>
>
> org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServle
> t.java
> :852)
>
>                  
> javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
>
>
> org.springframework.web.servlet.FrameworkServlet.service(FrameworkServ
> let.ja
> va:837)
>
>                  
> javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
>
>
> org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInterna
> l(Shal
> lowEtagHeaderFilter.java:81)
>
>
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRe
> questF
> 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.convertToWebApplicationExce
> ption(
> 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(SimpleAlbum
> Servic
> 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(I
> nvocab
> leHandlerMethod.java:215)
>
>
> org.springframework.web.method.support.InvocableHandlerMethod.invokeFo
> rReque
> st(InvocableHandlerMethod.java:132)
>
>
> org.springframework.web.servlet.mvc.method.annotation.ServletInvocable
> Handle
> rMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
>
>
> org.springframework.web.servlet.mvc.method.annotation.RequestMappingHa
> ndlerA
> dapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
>
>
> org.springframework.web.servlet.mvc.method.annotation.RequestMappingHa
> ndlerA
> dapter.handleInternal(RequestMappingHandlerAdapter.java:721)
>
>
> org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapte
> r.hand
> le(AbstractHandlerMethodAdapter.java:83)
>
>
> org.springframework.web.servlet.DispatcherServlet.doDispatch(Dispatche
> rServl
> et.java:943)
>
>
> org.springframework.web.servlet.DispatcherServlet.doService(Dispatcher
> Servle
> t.java:877)
>
>
> org.springframework.web.servlet.FrameworkServlet.processRequest(Framew
> orkSer
> vlet.java:961)
>
>
> org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServle
> t.java
> :852)
>
>                  
> javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
>
>
> org.springframework.web.servlet.FrameworkServlet.service(FrameworkServ
> let.ja
> va:837)
>
>                  
> javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
>
>
> org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInterna
> l(Shal
> lowEtagHeaderFilter.java:81)
>
>
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRe
> questF
> ilter.java:107)
>
>
> org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
>
>



Reply via email to