Ivan Ursul
Ivan Ursul

Reputation: 3711

Two Exception Mappers in Dropwizard

I have parent pom with Dropwizard service. In that service I have some exception mapper declaration, for example:

@Provider
class ExceptionMapperForClassA {...}

Now in my child pom I'm extending this parent service and I want to create New Exception mapper for ClassA and I would like to extend it from ExceptionMapperForClassA.

I couldn't find any information in Jersey doc, which describes behaviour of Jersey when two exception mappers for same class are declared.

https://jersey.java.net/documentation/latest/representations.html

Actually, the question is - How to override some exception mapper and be sure that only my exception mapper will be called ?

Upvotes: 1

Views: 1281

Answers (2)

Natan
Natan

Reputation: 2858

Unless that has changed, it's impossible to override an existing exception mapper. I don't remember where I had read it, but it said that you'd have randomly chosen mapper responding if you register more than one.

As my answer here suggests, you need to unregister the previous exception mapper and and assign yours but that also was made impossible after dropwizard 0.8. Unless 0.9 offers a solution for that, you should focus on making your parent-pom taking a parameter from outside and decide to whether to register that ExceptionMapperForClassA or not.

Upvotes: 1

pandaadb
pandaadb

Reputation: 6456

I ran a quick test and the behaviour is as follows:

If you have 2 Exception mappers mapping the same exception, it appears that the provider sorted by its name will be the one called. E.g. I have a ResourceNotFound mapper, that I extend with TestMapper. The latter is never called. If I rename the latter to ATestMapper, the first will never be called.

I would NOT rely on that behaviour however because I don't think it is defined anywhere (I might be wrong).

If you want to overwrite ExceptionMappers, I would recommend creating a base that is generic, for example:

    public abstract class BaseExceptionMapper<T extends Exception> extends LoggingExceptionMapper<T> {
        ...
    }

Define all your shared implementation in the base mapper, and extend it with specific mappers. That way you have exactly one mapper per Exception.

If you can not do the above and you do absolutely have 2 Mappers of the same type, you can explicitly overwrite the first by programatically adding it. For this, in your dropwizard application starter class, in the run method, you can do:

  JerseyEnvironment jersey = environment.jersey();
  jersey.getResourceConfig().register(TestMapper.class);

This will explicitly set this mapper as the exceptionmapper to be used.

Upvotes: 1

Related Questions