Websphere 8.5升级和java2安全性 - spring transaction中的奇怪错误

时间:2013-10-03 19:31:59

标签: security spring-transactions websphere-8

我们正在从WAS 6.1迁移到8.5。我只是复制了我们在6.1到8.5中部署的EAR文件。该应用程序工作正常,我很高兴,直到web-sphere管理员决定打开Java2安全性。当前was.policy文件有java.security.AllPermission。但我想这不适用于java2安全性,因此我更改了它并为每个读/写文件授予了io权限。在此之后,所有与权限相关的错误都消失了,但我遇到了一个奇怪的例外:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'wsJtaTm' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: 
Instantiation of bean failed; nested exception is 
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean]: 
Constructor threw exception; nested exception is
org.springframework.transaction.TransactionSystemException: Could not find WebSphere 5.1/6.0/6.1 TransactionManager factory class; nested exception is
java.lang.ClassNotFoundException: com.ibm.ws.Transaction.TransactionManagerFactory

我的spring事务定义如下:     

<bean id="wsJtaTm"
    class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean" />

<bean id="transactionManager"
    class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager" ref="wsJtaTm" />
</bean>

我不明白为什么应用程序在关闭Java2安全性时会起作用,为什么在我打开java2安全性时会抛出ClassNotFound异常。

据我所知,com.ibm.ws.Transaction.TransactionManagerFactory应该由服务器本身加载,并且应该可供应用程序使用。我的应用程序中没有任何jar有这个课程。

错误源自bean id wsJtaTm的构造函数。我错过了was.policy文件中的内容吗?

在进一步的研究中,我发现这个类存在于服务器安装的plugins文件夹中名为com.ibm.ws.runtime.jar的jar文件中。我不明白为什么在打开java2安全性时这个jar会变得不可见。

请注意我使用的是spring v2.5

请帮助。

1 个答案:

答案 0 :(得分:0)

com.ibm.ws.Transaction.TransactionManagerFactory类不是API,并且当启用Java 2安全性时,WebSphere Application Server限制对非API类的访问(如果应用程序可以访问内部类,则它们可以轻松绕过Java 2安全性)。尝试使用Spring的org.springframework.transaction.jta.WebSphereUowTransactionManager,它使用支持的UOWManager API。