eclipse-ee4j / eclipse-ee4j/jersey

Implementing Extended ExceptionMapper<T> interface generates javax.ws.rs.ProcessingException

Open
#4,127 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
730
Forks
382
PR merge metrics
No merged PRs in 30d

Description

Hi team. I created an interface that extends **ExceptionMapper** to introduce additional behaviour.

```
public interface DetailedExceptionMapper extends ExceptionMapper {

String getDetailedMessage(T t);
}
```

In my custom exception mappers I try to implement the above interface like this

```
public class ConstraintViolationExceptionMapper implements DetailedExceptionMapper {

@Override
public String getDetailedMessage(ConstraintViolationException ex) {}

@Override
public Response toResponse(ConstraintViolationException ex) {}
}
```

I then bind the custom exception mapper to Jersey. When I try to run the app, it produces the following stacktrace:

```
javax.servlet.ServletException: io.dropwizard.jersey.setup.JerseyServletContainer-6ee5f485@cb19b188==io.dropwizard.jersey.setup.JerseyServletContainer,jsp=null,order=1,inst=false
Caused by: A MultiException has 2 exceptions. They are:
1. javax.ws.rs.ProcessingException: Could not find exception type for given ExceptionMapper class: class com.flipkart.m3.selfserve.app.exception.mapper.ConstraintViolationExceptionMapper.
2. java.lang.IllegalStateException: Unable to perform operation: create on org.glassfish.jersey.internal.ExceptionMapperFactory

at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:392)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:487)
at org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:83)
at org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:71)
at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:154)
at org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:199)
at org.jvnet.hk2.internal.SingletonContext.findOrCreate(SingletonContext.java:122)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:682)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:78)
at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:943)
at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:993)
at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:1068)
at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:1059)
at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:600)
at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:184)
at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:350)
at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:347)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255)
at org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:347)
at org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:392)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369)
at javax.servlet.GenericServlet.init(GenericServlet.java:244)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:670)
... 41 more
Caused by: javax.ws.rs.ProcessingException: Could not find exception type for given ExceptionMapper class: class com.flipkart.m3.selfserve.app.exception.mapper.ConstraintViolationExceptionMapper.
at org.glassfish.jersey.internal.ExceptionMapperFactory.getType(ExceptionMapperFactory.java:263)
at org.glassfish.jersey.internal.ExceptionMapperFactory.getExceptionType(ExceptionMapperFactory.java:233)
at org.glassfish.jersey.internal.ExceptionMapperFactory.(ExceptionMapperFactory.java:209)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.glassfish.hk2.utilities.reflection.ReflectionHelper.makeMe(ReflectionHelper.java:1375)
at org.jvnet.hk2.internal.ClazzCreator.createMe(ClazzCreator.java:272)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:366)
... 69 more

```

Note that the following works perfectly fine.

```
public class ConstraintViolationExceptionMapper implements DetailedExceptionMapper, ExceptionMapper {

public interface DetailedExceptionMapper{

String getDetailedMessage(T t);
}

```

Other exception mappers that directly implement ExceptionMapper work fine.
I think that because of Generic type erasure, ExceptionMapper doesn't get passed to the extended interface. But I might be wrong.

**Context:**
Using Dropwizard-Jersey:1.3.7

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.