【问题标题】:Jersey: UriConnegFilter now declared final, breaks old code: how to fix it?泽西岛:UriConnegFilter 现在宣布为最终版本,打破旧代码:如何修复它?
【发布时间】:2016-07-30 18:44:30
【问题描述】:

在 Jersey 2.15 中,我使用了一个类 public class MyMediaTypeFilter extends UriConnegFilter (在我的 web.xml 中声明)返回与某些扩展相对应的内容类型(例如,当 URL 以“.html”结尾时返回 html 内容。)

这种进行“基于文件扩展名的内容协商”的方式似乎很常见(例如,在this question 接受的答案中对此进行了解释)

我刚刚尝试升级到 Jersey 2.22,但我的代码不再编译,因为 UriConnegFilter 现在被声明为 final。

有简单的解决方法吗?

TIA

【问题讨论】:

    标签: jersey


    【解决方案1】:

    回答我自己的问题(很简单):

    不是扩展 UriConnegFilter,而是实现 ContainerRequestFilter 接口,使用 UriConnegFilter 的实例作为属性:

    @PreMatching
    public class MediaTypeFilter implements ContainerRequestFilter {
        private UriConnegFilter filter;
        private static final Map<String, MediaType> mappedMediaTypes = new HashMap<String, MediaType>(4);
    
        static {
            mappedMediaTypes.put("html", MediaType.TEXT_HTML_TYPE);
            ...
        }
    
        public MediaTypeFilter() {
            filter = new UriConnegFilter(mappedMediaTypes, null);
        }
    
        @Override public void filter(ContainerRequestContext requestContext) throws IOException {
            filter.filter(requestContext);
        }
    }
    

    【讨论】:

      【解决方案2】:

      默认情况下,过滤器已注册。您需要做的就是提供一个带有映射的配置属性

      Map<String, MediaType> mediaTypes = ...
      resourceConfig.property(ServerProperties.MEDIA_TYPE_MAPPINGS, mediaTypes);
      

      如果您使用的是 web.xml(而不是 ResourceConfig),则可以添加 Feature 代替

      @Provider
      public UrlConnegFeature implements Feature {
          @Override
          public boolean configure(FeatureContext ctx) {
              Map<String, MediaType> mappings = ...
              ctx.property(ServerProperties.MEDIA_TYPE_MAPPINGS, mappings);
          }
      }
      

      【讨论】:

      • 我尝试了你的建议,但我没有成功(也许我没有足够努力,因为我现在有一些可行的方法:-))可能是我的 web.xml 中的问题(我我将球衣用作 servlet)我在提供程序类中注册了 UrlConnegFeature(参见 &lt;init-param&gt;&lt;param-name&gt;jersey.config.server.provider.classnames&lt;/param-name&gt;)。还有什么? (在我上面描述的工作解决方案中,还有&lt;init-param&gt;&lt;param-name&gt;com.sun.jersey.spi.container.ContainerRequestFilters&lt;/param-name&gt;)还是谢谢。
      • 如果您正在对所有资源和提供程序进行包扫描,则该功能应该被@Provider 注释拾取,尽管您也可以在...classnames init-param 中指定它。您提到的第二个 init-param 没用。泽西 1 用
      • 或者如果由于某种原因未注册过滤器,您可以显式注册它,以及该功能。关键是,试图扩展过滤器只是为了设置属性并不是最好的解决方案。只是无缘无故地添加了另一个类
      • 您对前面提到的&lt;init-param&gt;&lt;param-name&gt;com.sun.jersey.spi.container.ContainerRequestFilters&lt;/p‌​aram-name&gt; 是正确的。可以清除的垃圾。
      • 我明白你的意思,我很乐意听从你的建议。我想其他人会遇到和我一样的麻烦(泽西破坏了向后兼容性,过去曾推荐过使用 UriConnegFilter)。因此,对此类代码进行简单升级会很好。我检查了configure方法被调用了,所以找到了provider。我会尝试看看如何注册过滤器和功能。
      猜你喜欢
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      相关资源
      最近更新 更多