Dropwizard中的两个异常映射器

时间:2015-11-12 16:00:11

标签: jersey dropwizard

我有Dropwizard服务的父pom。在该服务中,我有一些异常映射器声明,例如:

@Provider
class ExceptionMapperForClassA {...}

现在我的孩子pom我正在扩展这个父服务,我想为 ClassA 创建新的异常映射器,我想从 ExceptionMapperForClassA 扩展它。 / p>

我在Jersey文档中找不到任何信息,它描述了当同一类的两个异常映射器被声明时Jersey的行为。

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

实际上,问题是 - 如何覆盖一些异常映射器并确保只调用我的异常映射器?

2 个答案:

答案 0 :(得分:1)

我进行了快速测试,行为如下:

如果有2个异常映射器映射相同的异常,则看起来按名称排序的提供者将是被调用的提供者。例如。我有一个ResourceNotFound映射器,我用TestMapper扩展。后者永远不会被称为。 如果我将后者重命名为ATestMapper,则永远不会调用第一个。

我不会依赖这种行为,因为我不认为它是在任何地方定义的(我可能是错的)。

如果要覆盖ExceptionMappers,我建议创建一个通用的基础,例如:

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

在基本映射器中定义所有共享实现,并使用特定映射器对其进行扩展。这样,每个Exception只有一个映射器。

如果您不能执行上述操作并且您确实拥有2个相同类型的Mapper,则可以通过以编程方式添加它来显式覆盖第一个Mapper。为此,在dropwizard应用程序入门类中,在run方法中,您可以执行以下操作:

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

这将明确将此映射器设置为要使用的异常映射器。

答案 1 :(得分:1)

除非已经改变,否则无法覆盖现有的异常映射器。我不记得我在哪里读过它,但它说如果你注册多个,你会随机选择mapper响应。

As my answer here建议你需要取消注册以前的异常映射器并分配你的,但是在dropwizard 0.8之后也是不可能的。除非0.9为此提供解决方案,否则您应该专注于让您的父pom从外部获取参数并决定是否注册ExceptionMapperForClassA