【问题标题】:OpenEntityManagerInViewInterceptor for CXFCXF 的 OpenEntityManagerInViewInterceptor
【发布时间】:2013-07-23 15:49:15
【问题描述】:

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

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

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

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

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

那么,你知道吗:

  • 用于 JPA API 的 HibernateInterceptorEntityManagerInterceptor?)
  • 一种将 Spring WebRequestInterceptor 改编为 JAX-RSfilter 的方法?
  • 还有其他解决方案吗?

提前感谢您的帮助。

【问题讨论】:

    标签: spring hibernate jpa transactions cxf


    【解决方案1】:

    再一次,我终于找到了我想要的…… 实际上有一个 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多