使用Spring配置文件启用/禁用web.xml过滤器

Gré*_*e C 3 spring web.xml spring-profiles

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

  • Spring Data JPA
  • Spring Data Neo4j

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

相关问题:

Gré*_*e C 5

好的,我把它排除了.我的新"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>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

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() {
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎有效.