【问题标题】:Two Exception Mappers in DropwizardDropwizard 中的两个异常映射器
【发布时间】:2015-11-12 16:00:10
【问题描述】:

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

@Provider
class ExceptionMapperForClassA {...}

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

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

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

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

【问题讨论】:

    标签: jersey dropwizard


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      除非发生变化,否则不可能覆盖现有的异常映射器。我不记得我在哪里读过它,但它说如果您注册多个映射器,您会随机选择映射器响应。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-15
        • 2021-12-05
        • 1970-01-01
        • 2014-09-18
        • 2021-11-04
        • 1970-01-01
        • 2020-12-03
        相关资源
        最近更新 更多