我有Dropwizard服务的父pom。在该服务中,我有一些异常映射器声明,例如:
@Provider
class ExceptionMapperForClassA {...}
现在我的孩子pom我正在扩展这个父服务,我想为 ClassA 创建新的异常映射器,我想从 ExceptionMapperForClassA 扩展它。 / p>
我在Jersey文档中找不到任何信息,它描述了当同一类的两个异常映射器被声明时Jersey的行为。
https://jersey.java.net/documentation/latest/representations.html
实际上,问题是 - 如何覆盖一些异常映射器并确保只调用我的异常映射器?
答案 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
。