我有一个使用JPA和JTA与Spring的Web应用程序。我想支持JBoss和Tomcat。在JBoss上运行时,我想使用JBoss自己的TransactionManager,当在Tomcat上运行时,我想使用JOTM。
我有两种情况都可以工作,但我现在发现我似乎需要为这两种情况分别使用两种Spring配置。使用JOTM,我需要使用Spring的JotmFactoryBean
:
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction">
<bean class="org.springframework.transaction.jta.JotmFactoryBean"/>
</property>
</bean>
但是在JBoss中,我只需要从JNDI获取“TransactionManager”:
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<bean class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="resourceRef" value="true" />
<property name="jndiName" value="TransactionManager" />
<property name="expectedType"
value="javax.transaction.TransactionManager" />
</bean>
</property>
</bean>
有没有办法配置它,以便使用适当的TransactionManager - JBoss或JOTM - 而不需要两个不同的配置文件?
答案 0 :(得分:14)
我认为你错过了JNDI的观点。 JNDI几乎是为了解决你遇到的问题而编写的!
我认为你可以把它提升一个级别,而不是根据你的情况使用“userTransaction”或“来自JNDI的transactionManager”。为什么不将“JtaTransactionManager”添加到JNDI。这样你就可以将配置推送到JNDI所在的位置,而不是创建更多的配置文件[比如已经不够了;]。
答案 1 :(得分:4)
您可以使用PropertyConfigurerPlaceholder注入bean引用以及简单值。
例如,如果你打电话给你的豆子'jotm'和'jboss'那么你可以注入你的TM:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE">
<property name="location" value="classpath:/path/to/application.properties"/>
</bean>
<bean id="jotm">...</bean>
<bean id="jboss">...</bean>
<bean id="bean-requiring-transaction-manager">
<property name="transactionManager" ref="${transaction.strategy}"/>
</bean>
然后您可以使用
交换事务管理器这是一种可行的方法。有关更完整的示例,请参阅我的blog。
希望这有帮助。
答案 2 :(得分:2)
如果您使用的是Spring 2.5,则可以使用&lt; tx:jta-transaction-manager /&gt;。我没有将它与JBoss一起使用,但它应该适用于你,根据Spring参考手册中的9.8 Application server-specific integration部分。
答案 3 :(得分:2)
<tx:jta-transaction-manager/>
方法将在多个默认位置listed here中查找事务管理器。如果你的JBoss事务管理器不在其中一个位置,我建议你移动它,如果可能的话,或者在Tomcat中移动它,这样两个容器的TM都在同一个JNDI位置。
答案 4 :(得分:1)
只是在这里添加我的经验,所以我不必再次重新体验这种体验。
正如bmatthews68,Chochos和these posters所说,在你的Spring bean文件中使用<tx:jta-transaction-manager/>
;它绝对提供了适当的抽象级别,并且没有必要在Spring方面做任何额外的事情。
对于Tomcat,我在默认/共享<Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" />
文件中声明conf/context.xml
,该文件绑定到java:comp/UserTransaction
。由于这是Spring搜索的地方之一,您不需要做任何其他事情。
但有一点需要注意:如果像我一样使用Maven,请确保排除javax.transaction:jta
jar上的任何依赖项或将范围设置为provided
。否则您将遇到类加载器问题。