Hmm...so I guess what I'm looking for is a way to define a sort of global
way to map status codes to exceptions so that I don't need to duplicate my
same try/catch logic around every client call. Aside from the
ResponseExceptionMapper, is there any way to do this for WebClient?

-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]] 
Sent: Thursday, October 16, 2014 11:23 AM
To: [email protected]
Subject: Re: Trouble configuring custom ResponseExceptionMapper

On 16/10/14 17:04, Curtis Garman wrote:
> 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?

WebClient is not supposed to deal with ResponseExceptionMapper - its purpose
is to facilitate the optional mapping of HTTP errors to Exception classes
listed in proxy method signatures

Sergey
>
> -----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(Frame
>> w
>> orkSer
>> vlet.java:973)
>>
>>
>> org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServl
>> e
>> t.java
>> :852)
>>
>>
>> javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
>>
>>
>> org.springframework.web.servlet.FrameworkServlet.service(FrameworkSer
>> v
>> let.ja
>> va:837)
>>
>>
>> javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
>>
>>
>> org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterIntern
>> a
>> l(Shal
>> lowEtagHeaderFilter.java:81)
>>
>>
>> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerR
>> e
>> 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.convertToWebApplicationExc
>> e
>> 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:58
>> 9
>> )
>>
>>
>> test.webservice.rest.service.SimpleAlbumService.findAlbums(SimpleAlbu
>> m
>> Servic
>> e.java:28)
>>
>>
>> test.webservice.rest.servlet.AlbumController.list(AlbumController.jav
>> a
>> :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.invokeF
>> o
>> rReque
>> st(InvocableHandlerMethod.java:132)
>>
>>
>> org.springframework.web.servlet.mvc.method.annotation.ServletInvocabl
>> e
>> Handle
>> rMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
>>
>>
>> org.springframework.web.servlet.mvc.method.annotation.RequestMappingH
>> a
>> ndlerA
>> dapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
>>
>>
>> org.springframework.web.servlet.mvc.method.annotation.RequestMappingH
>> a
>> ndlerA
>> dapter.handleInternal(RequestMappingHandlerAdapter.java:721)
>>
>>
>> org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapt
>> e
>> r.hand
>> le(AbstractHandlerMethodAdapter.java:83)
>>
>>
>> org.springframework.web.servlet.DispatcherServlet.doDispatch(Dispatch
>> e
>> rServl
>> et.java:943)
>>
>>
>> org.springframework.web.servlet.DispatcherServlet.doService(Dispatche
>> r
>> Servle
>> t.java:877)
>>
>>
>> org.springframework.web.servlet.FrameworkServlet.processRequest(Frame
>> w
>> orkSer
>> vlet.java:961)
>>
>>
>> org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServl
>> e
>> t.java
>> :852)
>>
>>
>> javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
>>
>>
>> org.springframework.web.servlet.FrameworkServlet.service(FrameworkSer
>> v
>> let.ja
>> va:837)
>>
>>
>> javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
>>
>>
>> org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterIntern
>> a
>> l(Shal
>> lowEtagHeaderFilter.java:81)
>>
>>
>> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerR
>> e
>> questF
>> ilter.java:107)
>>
>>
>> org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52
>> )
>>
>>
>
>
>


Reply via email to