3

2 つの異なる永続化 API を使用できる Spring アプリケーションがあります。

  • 春のデータ JPA
  • 春のデータ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>

問題は、Spring Data Neo4j を使用しているときにこのフィルターを有効にしたままにできないことです。有効のままにすると、次のランタイム エラーが発生します。

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

Spring プロファイルで使用するデータベースを選択したい (例:spring.profiles.active=relational-databaseまたはspring.profiles.active=graph-database)。

質問: プロファイルが "relational-database" の場合に "OpenEntityManagerInViewFilter" を有効にし、プロファイルが "graph-database" の場合に無効にするにはどうすればよいですか?

ありがとう!

関連する質問:

4

1 に答える 1

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値) という名前の Bean を作成します。秘訣は、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() {
    }
}

これはうまくいくようです。

于 2015-06-12T15:11:11.263 に答える