如何将 Spring Data JPA Repository 注入 Servlet Filter?

How to inject a Spring Data JPA Repository into a Servlet Filter?

我正在使用 Tuckey UrlRewriteFilter。我想使用数据库中的重写规则,因此使用 <class-rule class="com.example.Foo" /> 配置,它可以让您在运行时获取规则。我创建了一个 class 扩展 RewriteRule:

public class Foo extends RewriteRule {

  @Autowired
  private MyRepository myRepository;

  public boolean init(ServletContext servletContext) {

    return true;
  }

  @Override
  public RewriteMatch matches(HttpServletRequest request, HttpServletResponse response) {

    //myRepository is null

    return super.matches(request, response);
  }

  @Override
  public void destroy() {

  }
}

我想在这个 Foo class 中使用 Spring Data JPA 存储库,但它看起来存储库是空的。

如何正确注入?

像往常一样在 web.xml 中声明您的过滤器,除了您需要提供 org.springframework.web.filter.DelegatingFilterProxy 作为过滤器 class 名称而不是您实际的 class 名称。

<filter>
  <filter-name>urlRewriteFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  <init-param>
      <param-name>targetFilterLifecycle</param-name>
      <param-value>true</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>urlRewriteFilter</filter-name>
  <url-pattern>/</url-pattern>
</filter-mapping>

最后,在您的 ROOT 应用程序上下文中,声明一个指向您的过滤器 class 的 bean,其名称与从 [= 加载的应用程序上下文文件中 web.xml 中提供的过滤器名称相同12=]:

<bean id="urlRewriteFilter" class="org.tuckey.web.filters.urlrewrite.UrlRewriteFilter"/>

由于您的过滤器实例现在由 Spring 管理,您可以将任何 Spring 托管 bean 注入其中。