带有spring ldap的Classcastexception

时间:2016-08-02 20:10:39

标签: java spring hibernate transactions spring-ldap

我们正在将ldap从java ldap库更改为spring以利用回滚。它主要起作用。居多。

我们遇到的一个问题是,无论何时抛出异常,而不是异常冒泡,我们都会得到:

Caused by: java.lang.ClassCastException: org.springframework.ldap.transaction.compensating.manager.ContextSourceAndHibernateTransactionManager$ContextSourceAndHibernateTransactionObject incompatible with org.springframework.orm.hibernate3.HibernateTransactionManager$HibernateTransactionObject
at org.springframework.orm.hibernate3.HibernateTransactionManager.doSetRollbackOnly(HibernateTransactionManager.java:696) ~[spring-orm-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:852) ~[spring-tx-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822) ~[spring-tx-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:410) ~[spring-tx-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:114) ~[spring-tx-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]

这吞噬了例外情况。然而,它似乎并没有阻止实际发生的回滚。

我们的春季配置的相关部分:

<ldap:context-source
          url="${LDAP_URL_SSL}"
          base="${SEARCHBASE_DC}"
          referral="follow"
          authentication-source-ref="afmsAuthenticationSource" />
<ldap:ldap-template id="ldapTemplate" />
<bean id="txManager" name="txManager transactionManager" class="my.package.hibernate.HibernateTransactionManager">
    <property name="sessionFactory" ref="enoteSessionFactory" />
    <property name="defaultUserName" value="umc.not.provided" />
    <property name="defaultApplicationId" value="umc" /> 
</bean> 
<ldap:transaction-manager id="ldapTransactionManager" session-factory-ref="sessionFactory" >
       <ldap:default-renaming-strategy />
</ldap:transaction-manager>

你会注意到我们既有一个hibernate事务管理器(我们很久以前定制过并且已经永久工作)和新的contextsource事务管理器。两者都是通过AOP或@Transactional调用的,具体取决于代码的哪一部分。

我们对于是否应该使用ldap(可能同时执行这两项工作)或添加它来替换现有的tx管理器存在一些分歧。做这项工作的开发人员认为ADD TO。我认为REPLACE,我认为这个例外是两者兼顾的症状。

无论如何,有人可以就可能导致此异常的原因提供建议,以及是否有一个或两个tx管理器是使用此库的正确方法?

0 个答案:

没有答案