【发布时间】:2013-04-13 15:06:57
【问题描述】:
我需要在 Jersey 中创建一个自定义 ExceptionMapper 来处理 Jackson 返回的 JsonProcessingException。
Jackson 库已经以 JsonMappingExceptionMapper.java 和 JsonParseExceptionMapper.java (link) 的形式包含此异常的 ExceptionMapper 提供程序。
如果我在“my.package”中为这个异常映射器添加一个新的提供者,我会得到关于所选提供者的不可预知的结果。有时它会选择“my.package”中的提供者,有时它会选择杰克逊库中的提供者。我用来扫描包的代码如下。
PackgesResourceConfig packagesResourceConfig = new PackgesResourceConfig("com.fasterxml.jackson.jaxrs", "my.package");
建议的解决方案
目前,我通过手动过滤掉 Jackson 库中的提供程序来解决这个问题。但我真正想知道的是,是否有更可接受和支持的方式来做到这一点。
首先我扩展 PackagesResourceConfig。
public class FilteredPackgesResourceConfig extends PackagesResourceConfig {
private Set<Class<?>> classesToFilter = new HashSet<Class<?>>();
public FilteredPackgesResourceConfig(String... packages) {
super(packages);
}
public FilteredPackgesResourceConfig(Map<String, Object> props) {
super(props);
}
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = super.getClasses();
if (classes != null && classesToFilter != null) {
classes.removeAll(classesToFilter);
}
return classes;
}
public Set<Class<?>> getClassesToFilter() {
return classesToFilter;
}
public void setClassesToFilter(Set<Class<?>> classesToFilter) {
this.classesToFilter = classesToFilter;
}
}
这个我使用这个类来过滤掉我不想要的特定提供者。
FilteredPackgesResourceConfig packagesResourceConfig = new FilteredPackgesResourceConfig("com.fasterxml.jackson.jaxrs", "my.package");
classesToFilter.add(com.fasterxml.jackson.jaxrs.json.JsonMappingExceptionMapper.class);
classesToFilter.add(com.fasterxml.jackson.jaxrs.json.JsonParseExceptionMapper.class);
packagesResourceConfig.setClassesToFilter(classesToFilter);
此解决方案为我提供了仅使用我指定的提供程序的预期结果。 有没有更正确的方法可以达到同样的效果?
【问题讨论】:
-
Jersey 2.29.1 添加了对注册 JacksonFeature 的支持,而没有异常处理程序。见:github.com/eclipse-ee4j/jersey/issues/4200