当前位置: 首页 > 知识库问答 >
问题:

覆盖新泽西州的包括提供商

能正青
2023-03-14

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

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

如果我在“my.package”中为这个异常映射器添加一个新的提供程序,我会得到关于所选提供程序的不可预测的结果。有时它会在“my.package”中选择提供程序,有时它会在Jackson库中选择提供程序。我用来扫描包的代码如下。

PackgesResourceConfig packagesResourceConfig = new PackgesResourceConfig("com.fasterxml.jackson.jaxrs", "my.package");

建议的解决方案

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

首先我扩展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);

这个解决方案给了我只使用我指定的提供者的预期结果。有没有更正确的方法来实现相同的结果?

共有2个答案

龙安阳
2023-03-14

我有同样的要求,其中我必须使用实现ExceptionMapper的自定义ExceptionMapper

幸运的是,Jersey 2.29.1添加了对注册JacksonFeature的支持,没有异常处理程序。链接功能请求链接,代码更改。

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

@Provider
public class ApplicationInitializer extends ResourceConfig {
    public ApplicationInitializer() {
        register(JacksonFeature.withoutExceptionMappers());
    }
}
苗森
2023-03-14

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

有几种方法可以做到这一点,我是用网络做到的。类似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>

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

 类似资料:
  • 我是新来的泽西框架。只是想知道使用异常映射器的优势是什么。如果我想把任何错误抛给其他消费者,我可以在方法中执行以下操作,Response.status(502)。实体(“注册期间服务器错误”)。build();为什么建议使用异常映射器,请帮助我理解?

  • 类似于另一个问题(参见过滤静态内容Jersey),我想从Jetty提供静态内容。在浩瀚的互联网上散布着几个类似的问题,但大多数都不涉及Guice,而那些涉及Guice的问题已经完全过时了。 我有一个现有的服务,使用泽西(1.12)和Guice(3)与以下: < code>MyGuiceConfig看起来像这样: 当我使用 时,我的服务按预期工作。但是,任何对静态内容的请求都会产生404。 如何在不

  • 我试图用户泽西的JSON/bean验证,但是当初始化servlet发生错误。 全栈跟踪: pom.xml: 可能引发异常的行: 更新:使用Java8 更多的文字,这样我就可以发布这个问题更多的文字,这样我就可以发布这个问题更多的文字,这样我就可以发布这个问题更多的文字,这样我就可以发布这个问题更多的文字,这样我就可以发布这个问题再发些短信,这样我就可以发布这个问题了

  • 我有一个多模块项目,如下所示: 在这个项目中,服务客户端将实现对我正在调用的任何服务的调用,数据模块将只是数据类。目前,雅各科考虑了所有这些模块。有没有办法排除完整的模块,如数据模块或服务客户模块,因为在这两种情况下都不需要UTs?

  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?

  • 问题: 我将customerName传递为:堆栈溢出(URL编码为:堆栈溢出)。我希望在java代码中接收解码字符串(堆栈溢出,无)。 我试过的: 这很好用,但我觉得这不是更通用的方法。 需要更通用的解决方案:我想在其余的API中也做类似的更改,因此在每个API中使用URLDecker是一种负担。我可以遵循什么常见做法在应用程序级别强制执行这种解码?(@PathParam在我收到请求时已被解码)