用于CXF的OpenEntityManagerInViewInterceptor

时间:2013-07-23 15:49:15

标签: spring hibernate jpa transactions cxf

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

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

问题是,由于我使用的是 CXFServlet ,而不是标准的Spring Servlet,我不能在web.xml中使用 OpenEntityManagerInViewFilter

我不能使用 OpenEntityManagerInViewInterceptor ,它适用于WebRequest拦截器(并且不适用于CXF拦截器/过滤器)。

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

那么,您是否知道:

  • JPA API的 HibernateInterceptor EntityManagerInterceptor ?)
  • 将Spring WebRequestInterceptor 改编为 JAX-RSfilter 的方法?
  • 还有其他解决方案吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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>