泽西岛:UriConnegFilter现在宣布决赛,打破旧代码:如何修复它?

时间:2016-04-09 13:45:50

标签: jersey

在泽西岛2.15,我正在上课 public class MyMediaTypeFilter extends UriConnegFilter (在我的web.xml中声明)返回与某些扩展名对应的内容类型(例如,当URL以“.html”结尾时返回html内容。)

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

我只是尝试升级到Jersey 2.22,我的代码不再编译,因为UriConnegFilter现在被宣布为final。

有简单的解决方法吗?

TIA

2 个答案:

答案 0 :(得分:0)

回答我自己的问题(这很容易):

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

@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);
    }
}

答案 1 :(得分:0)

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

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);
    }
}