2015-06-12 2 views
2

У меня есть приложение Spring, который может использовать два различных Persistence API:Включение/отключение web.xml фильтр, используя профиль Spring

  • Spring Data JPA
  • Spring Data Neo4j

Когда используя Spring Data JPA, мне нужно объявить «OpenEntityManagerInViewFilter» в «web.xml» для ленивой загрузки:

<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. Оставив это позволило приводит к следующей ошибке во время выполнения:

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

Я хочу, чтобы выбрать, какие базы данных для использования с весенним профилем (например, spring.profiles.active=relational-database или spring.profiles.active=graph-database).

Вопрос: как включить «OpenEntityManagerInViewFilter», когда профиль «реляционная база данных», и отключить его, когда профиль «graph-database»?

Спасибо!

Похожие вопросы:

+0

Вы не можете, так как web.xml не имеет ничего общего с Spring. Вы могли бы использовать решение из вопроса, с которым вы связались, и в случае не нуждающегося в нем, используя фиктивный фильтр вместо фактического фильтра. –

+0

Идея заключалась бы в создании моей собственной «no-op» реализации 'org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter' и загрузки ее только тогда, когда профиль« graph-database »? –

+0

Нет, просто создайте noop-реализацию фильтра, которого достаточно, чтобы он не был конкретным. –

ответ

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> 

Тогда в моем ApplicationContext, я создаю компонент под названием «toggleOpenEntityManagerInViewFilter» (это значение 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> 

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() { 
    } 
} 

Это похоже на работу.

+1

Будущие читатели: если вы используете старую версию Spring, наличие двух элементов '', вложенных в один корень '' node (и 'profiles', если на то пошло), требуется Spring 3.1, а в файле XML namespace 'http://www.springframework.org/schema/beans http: // www.springframework.org/schema/beans/spring-beans-3.1.xsd'. – orlade

Смежные вопросы