Java 覆盖Jersey中包含的提供程序

Java 覆盖Jersey中包含的提供程序,java,jersey,jackson,Java,Jersey,Jackson,我需要在Jersey中创建一个自定义ExceptionApper来处理Jackson返回的JsonProcessingException Jackson库已经以JsonMappingExceptionMapper.java和JsonParseExceptionMapper.java()的形式包含此异常的ExceptionMapper提供程序 如果在“my.package”中为此异常映射器添加新的提供程序,则会得到与所选提供程序相关的不可预测的结果。有时它会选择“my.package”中的提供者,

我需要在Jersey中创建一个自定义ExceptionApper来处理Jackson返回的JsonProcessingException

Jackson库已经以JsonMappingExceptionMapper.java和JsonParseExceptionMapper.java()的形式包含此异常的ExceptionMapper提供程序

如果在“my.package”中为此异常映射器添加新的提供程序,则会得到与所选提供程序相关的不可预测的结果。有时它会选择“my.package”中的提供者,有时它会选择Jackson库中的提供者。下面是我用来扫描软件包的代码

PackgesResourceConfig packagesResourceConfig = new PackgesResourceConfig("com.fasterxml.jackson.jaxrs", "my.package");
建议的解决方案

目前我正在通过手动过滤Jackson库中的提供者来解决这个问题。但我真正想知道的是,是否有一种更可接受和更受支持的方式来做到这一点

首先,我扩展了PackageResourceConfig

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;
    }
}
此解决方案只使用我指定的提供程序,从而获得所需的结果。
有没有更正确的方法来实现相同的结果?

我也遇到了这个问题,在我的例子中,我通过注册
com.fasterxml.jackson.jaxrs.json
包解决了这个问题,我只注册了我想要的类,在我的例子中是
com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider

有几种方法可以做到这一点,我使用web.xml这样做:

<servlet>
  <servlet-name>jersey-serlvet</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  <init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>
         my.own.package
         my.other.package
      </param-value>
  </init-param>
  <init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>
      com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider
    </param-value>
  </init-param>
    <init-param>
      <param-name>jersey.config.disableMoxyJson</param-name>
      <param-value>true</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

泽西塞尔维特酒店
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
我自己的包裹
我的其他包裹
jersey.config.server.provider.classnames

com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider jersey.config.disableMoxyJson 真的 1.

注意:我使用的是Jersey 2.0,在1.x中,属性名和servlet类不同,但可以使用相同的配置。

我有相同的要求,其中我必须使用自定义ExceptionMapper,它为所有
异常类型实现
ExceptionMapper
。不幸的是,Jersey默认注册
org.glassfish.Jersey.jackson.JacksonFeature
如果依赖项
Jersey media json jackson
存在于inturn注册
JsonParseExceptionMapper
JsonMappingExceptionMapper
的类路径中,则会自动注册这些默认json异常映射器接收所有与JSON相关的异常,这就是为什么不特别针对JSON异常调用
自定义异常映射器的原因


幸运的是,Jersey 2.29.1添加了对注册JacksonFeature而不使用异常处理程序的支持。链接

因此,我们必须通过排除以下异常映射器来覆盖默认的
JacksonFeature

@Provider
public class ApplicationInitializer extends ResourceConfig {
    public ApplicationInitializer() {
        register(JacksonFeature.withoutExceptionMappers());
    }
}

不推荐使用com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider。Jersey 2.29.1增加了对注册JacksonFeature而不使用异常handers的支持。见:
@Provider
public class ApplicationInitializer extends ResourceConfig {
    public ApplicationInitializer() {
        register(JacksonFeature.withoutExceptionMappers());
    }
}