Quantcast
Channel: Apache Timeline
Viewing all articles
Browse latest Browse all 5648

Trouble configuring custom ResponseExceptionMapper

$
0
0
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)

Viewing all articles
Browse latest Browse all 5648

Trending Articles