使用 Spring 配置文件启用/禁用 web.xml 过滤器 [英] Enabling/disabling a web.xml filter using a Spring profile

查看:44
本文介绍了使用 Spring 配置文件启用/禁用 web.xml 过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个可以使用两种不同持久性 API 的 Spring 应用程序:

I have a Spring application that can use two different persistence API:

  • Spring 数据 JPA
  • Spring Data Neo4j

使用 Spring Data JPA 时,我需要在web.xml"中声明OpenEntityManagerInViewFilter"来进行延迟加载:

When using Spring Data JPA, I need to declare the "OpenEntityManagerInViewFilter" in "web.xml" to do lazy loading:

<filter>
    <filter-name>OpenEntityManagerInViewFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>OpenEntityManagerInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

问题是我无法在使用 Spring Data Neo4j 时启用此过滤器.启用它会导致以下运行时错误:

The problem is that I cannot keep this filter enabled when using Spring Data Neo4j. Leaving it enabled leads to the following runtime error:

No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined

我想选择与 Spring 配置文件一起使用的数据库(例如 spring.profiles.active=relational-databasespring.profiles.active=graph-database).

I want to choose which database to use with a Spring profile (e.g. spring.profiles.active=relational-database or spring.profiles.active=graph-database).

问题:如何在配置文件为关系数据库"时启用OpenEntityManagerInViewFilter",并在配置文件为图形数据库"时禁用它?

Question: how can I enable the "OpenEntityManagerInViewFilter" when profile is "relational-database", and disable it when profile is "graph-database"?

谢谢!

相关问题:

  • How to conditionally enable/disable filter in web.xml but I'm not using DelegatingFilterProxy.

推荐答案

好的,我解决了这个问题.我的新web.xml"使用 DelegatingFilterProxy 而不是 org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter:

Ok, I sorted this out. My new "web.xml" uses DelegatingFilterProxy instead of org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter:

<filter>
    <filter-name>toggleOpenEntityManagerInViewFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>toggleOpenEntityManagerInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

然后在我的 ApplicationContext 中,我创建了一个名为toggleOpenEntityManagerInViewFilter"的 bean(它是 filter-name 值).诀窍是根据 Spring 配置文件实例化不同的类:

Then in my ApplicationContext, I create a bean named "toggleOpenEntityManagerInViewFilter" (which is the filter-name value). The trick is to instanciate a different class depending on the Spring profile:

<beans profile="graph-database">
    <bean id="toggleOpenEntityManagerInViewFilter" class="my.project.dal.utils.spring.DoNothingFilter"/>
</beans>
<beans profile="relational-database">
    <bean id="toggleOpenEntityManagerInViewFilter" class="org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter"/>
</beans>

my.project.dal.utils.spring.DoNothingFilter 定义为:

public class DoNothingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
    }
}

这似乎有效.

这篇关于使用 Spring 配置文件启用/禁用 web.xml 过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆