使用Spring配置文件启用/禁用web.xml筛选器

使用Spring配置文件启用/禁用web.xml筛选器,spring,web.xml,spring-profiles,Spring,Web.xml,Spring Profiles,我有一个Spring应用程序,它可以使用两种不同的持久性API: Spring数据JPA 弹簧数据Neo4j 在使用Spring数据JPA时,我需要在“web.xml”中声明“OpenEntityManagerViewFilter”以执行延迟加载: <filter> <filter-name>OpenEntityManagerInViewFilter</filter-name> <filter-class>org.springf

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

  • Spring数据JPA
  • 弹簧数据Neo4j
在使用Spring数据JPA时,我需要在“web.xml”中声明“OpenEntityManagerViewFilter”以执行延迟加载:

<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概要文件一起使用的数据库(例如,
Spring.profiles.active=关系数据库
Spring.profiles.active=图形数据库

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

谢谢

相关问题:

  • 但是我没有使用
    DelegatingFilterProxy

好的,我把它整理好了。我的新“web.xml”使用了
DelegatingFilterProxy
而不是
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>
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() {
    }
}

这似乎有效。

您不能,因为web.xml与Spring无关。您可以使用链接到的问题的解决方案,在不需要它的情况下,使用虚拟筛选器而不是实际筛选器。想法是创建我自己的
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
的“无操作”实现,并仅在配置文件为“图形数据库”时加载它?不,只要创建一个过滤器的noop实现就足够了,它不必是一个特定的实现。未来的读者:如果您使用的是旧版本的Spring,在一个根节点中嵌套两个
元素(以及
配置文件
),则需要Spring 3.1,在XML文件中,名称空间
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
<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>
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() {
    }
}