0

我有一个基于JPA (Hibernate)、SpringCXF的 Web 服务应用程序。我在事务性业务方法之后面临一些延迟加载异常(因为我需要在 rpesentation 层中呈现一些额外的 bean),我想尝试一下 OpenSession/ EntityManagerInView模式。

请不要争论这个选择,我们只是试一试。

问题是,因为我使用的是CXFServlet而不是标准的 Spring Servlet,所以我不能在 web.xml 中使用OpenEntityManagerInViewFilter 。

我不能使用作为 WebRequest 拦截器应用的任何OpenEntityManagerInViewInterceptor(并且不适用于 CXF 拦截器/过滤器)。

最后我知道了HibernateInterceptor,这是一个将任何方法包装到会话中的 AOP 代理。但仍然:这个是针对 Hibernate API,而不是 JPA API(我使用的是EntityManagerFactory,而不是SessionFactory)。

那么,您是否知道:

  • JPA API的HibernateInterceptor ( EntityManagerInterceptor ?)
  • 一种将 Spring WebRequestInterceptor调整为JAX-RSfilter 的方法
  • 还有其他解决方案吗?

在此先感谢您的帮助。

4

1 回答 1

0

再一次,我终于找到了我想要的......实际上有一个JpaInterceptor可以做我想要的(虽然它似乎已被弃用。我真的不明白为什么)。

这是生成的配置,就像一个魅力一样,带有一些名称的自动代理:

   <bean id="jpaInterceptor" class="org.springframework.orm.jpa.JpaInterceptor"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
   </bean> 

   <bean id="jpaAutoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >
    <property name="beanNames">
      <list>
        <value>myService1</value>
        <value>myService2</value>
        <value>...</value>
      </list>
    </property>
    <property name="interceptorNames">
       <list><value>jpaInterceptor</value></list>
    </property>
  </bean>

<jaxrs:server id="services" address="/">

    <jaxrs:serviceBeans>
        <ref bean="myService1" />
        <ref bean="myService2" />
        <ref bean="..." />

    </jaxrs:serviceBeans>
</jaxrs:server>
于 2013-07-24T09:15:13.253 回答