Apache camel JTA容器管理的事务回滚不适用于jaxrs端点

Apache camel JTA容器管理的事务回滚不适用于jaxrs端点,apache-camel,jax-rs,jta,jbossfuse,aries,Apache Camel,Jax Rs,Jta,Jbossfuse,Aries,静止端点 当dao2 persist失败时,事务没有回滚。Entity1被插入到数据库中 补充资料 1) TransactionManager定义 <reference id="platformTransactionManager" interface="org.springframework.transaction.PlatformTransactionManager" /> <bean id="JTA_TRANSACTION" class="org.apache.camel

静止端点

当dao2 persist失败时,事务没有回滚。Entity1被插入到数据库中

补充资料

1) TransactionManager定义

<reference id="platformTransactionManager" interface="org.springframework.transaction.PlatformTransactionManager" />
<bean id="JTA_TRANSACTION" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
    <property name="transactionManager" ref="platformTransactionManager" />
    <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" />
</bean>

2) 我的持久化单元是JTA类型,hibernate作为提供程序

3) 我有一个ExceptionMapper,当我查看它时,stacktrace显示事务确实被标记为回滚

4) 服务bean不会分离到另一个包

5) Hibernate自动提交不正确

我想知道:

  • CXF OutFaultInterceptor已经“吃掉”了容器应该捕获的异常以进行事务回滚。因此,没有发生回滚

  • 实体管理器必须是所有DAO共享的同一实例,才能发生回滚

  • 我是否需要将服务拆分为另一个捆绑包


  • 如果有人能让我知道cxf jaxrs端点服务层事务处理的正确方法,我将不胜感激。

    原始数据源在blueprint bundle中声明,它使用commons-dbcp2。最后,我使用pax jdbc池dbcp版本0.8.0实现了这一点

    参考:

    感谢克里斯蒂安·施耐德的提示

    <route id="secureBridgeRoute">
        <from uri="jetty:https://0.0.0.0:443/jaxrs?sslContextParametersRef=sslContextParameters&amp;matchOnUriPrefix=true&amp;minThreads=8&amp;maxThreads=16" />
        <transacted ref="JTA_TRANSACTION" />
        <to uri="jetty:http://127.0.0.1:8080/jaxrs?bridgeEndpoint=true&amp;throwExceptionOnFailure=true" />
    </route>
    
    <bean id="dao1" class="com.example.Dao1" activation="eager">
        <jpa:context unitname="PU" property="entityManager" type="TRANSACTION" />
    </bean>
    
    <bean id="service1" class="com.example.Service1" activation="eager">
        <property name="dao1" ref="dao1" />
        <property name="dao2" ref="dao2" />
        <tx:transaction method="*" value="Required" />
    </bean>
    
    boolean create(entity1, entity2) {
        dao1.persist(entity1);
        dao2.persist(entity2);
    }
    
    <reference id="platformTransactionManager" interface="org.springframework.transaction.PlatformTransactionManager" />
    <bean id="JTA_TRANSACTION" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="transactionManager" ref="platformTransactionManager" />
        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" />
    </bean>