【问题标题】:Spring and Jersey Filter - Provider or Component?Spring and Jersey 过滤器 - 提供者还是组件?
【发布时间】:2015-08-16 23:51:06
【问题描述】:

我正在尝试确定 spring-boot、jersey 以及 jersey 和 spring-boot 上下文如何相互关联。

@Component
public class CORSFilter implements Filter {


    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {
    }

    public void destroy() {
    }


}

当我将它标记为 @Provider 并让 Jersey 查找它所在的包时,它找不到它。当我将它设为@Component 时它会起作用。

@Configuration
@ApplicationPath("/api/v1")
public class JerseyConfig extends ResourceConfig{

    public JerseyConfig() {
        // DOESNT FIND MY CORSFilter as  Provider
        this.packages("com.mypackage.rest");
    }


}

@Configuration 注解是否使 JerseyContext 成为 Spring bean?然后 spring 注入 CORSFilter 是因为它找到了一个 Filter 类型的组件?这里发生了什么?

【问题讨论】:

    标签: java spring jersey spring-boot jax-rs


    【解决方案1】:

    您正在实现一个 servlet 过滤器(实现过滤器),这意味着 servlet 容器正在实例化过滤器。当您提供 @component 注释时,它仍然是初始化此过滤器的 servlet 容器。只有 spring 上下文使用 contextloader 侦听器知道这一点。

    在 jersey 中,您的过滤器应实现 ContainerRequestFilterContainerResponseFilter,以便将 jersey 配置应用于过滤器,如 URL 路径。 由于您使用了 servlet 过滤器,因此您应该手动配置它。

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多