平凡的小屋(Ordinary hut)
http://hi.baidu.com/landor2004/blog/item/b6dc082a9e4e2b25d42af122.html
在配置的时候一定要小心,JNDI的名字大小写一定要完全一致,
我们经常犯的错误就是把其中一两个字母大小写混淆,
而这种情况往往半天都查不出问题在哪里!
其实基本配置很简单,weblogic的数据源JNDI名字是:TestDataSource,
那么ibatis的SqlMapConfig.xml的配置如下
<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="context.java.naming.factory.initial" value="weblogic.jndi.WLInitialContextFactory" />
<property name="context.java.naming.provider.url" value="t3://localhost:7001" />
<property name="DataSource" value="TestDataSource" />
</dataSource>
</transactionManager>
此时启动weblogic服务器,进行正常junit测试即可(这里需要把weblogic.jar加到classpath中)
然而如果用如下的配置方式
<transactionManager type="JTA" >
<property name="UserTransaction" value="javax.transaction.UserTransaction"/>
<dataSource type="JNDI">
<property name="context.java.naming.factory.initial" value="weblogic.jndi.WLInitialContextFactory" />
<property name="context.java.naming.provider.url" value="t3://localhost:7001" />
<property name="DataSource" value="TestDataSource" />
</dataSource>
</transactionManager>
也就是用JTA来做事务,那么会出现错误
java.lang.ExceptionInInitializerError
at gmt.boss.obs.account.recurringcharge.IbatisTest.setUp(IbatisTest.java:12)
at junit.framework.TestCase.runBare(TestCase.java:128)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.RuntimeException: Error occurred. Cause:
com.ibatis.common.xml.NodeletException: Error parsing XML. Cause:
java.lang.RuntimeException: Error parsing XPath
'/sqlMapConfig/transactionManager/end()'. Cause:
com.ibatis.sqlmap.client.SqlMapException: Error initializing
JtaTransactionConfig while looking up UserTransaction
(javax.transaction.UserTransaction). Cause:
javax.naming.NoInitialContextException: Need to specify class name in
environment or system property, or as an applet parameter, or in an
application resource file: java.naming.factory.initial
at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:89)
at com.ibatis.sqlmap.client.SqlMapClientBuilder.buildSqlMapClient(SqlMapClientBuilder.java:63)
at testIbatis.IbatisInstance.<clinit>(IbatisInstance.java:27)
... 12 more
Caused by: com.ibatis.common.xml.NodeletException: Error parsing XML.
Cause: java.lang.RuntimeException: Error parsing XPath
'/sqlMapConfig/transactionManager/end()'. Cause:
com.ibatis.sqlmap.client.SqlMapException: Error initializing
JtaTransactionConfig while looking up UserTransaction
(javax.transaction.UserTransaction). Cause:
javax.naming.NoInitialContextException: Need to specify class name in
environment or system property, or as an applet parameter, or in an
application resource file: java.naming.factory.initial
at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:53)
at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:86)
... 14 more
Caused by: java.lang.RuntimeException: Error parsing XPath
'/sqlMapConfig/transactionManager/end()'. Cause:
com.ibatis.sqlmap.client.SqlMapException: Error initializing
JtaTransactionConfig while looking up UserTransaction
(javax.transaction.UserTransaction). Cause:
javax.naming.NoInitialContextException: Need to specify class name in
environment or system property, or as an applet parameter, or in an
application resource file: java.naming.factory.initial
at com.ibatis.common.xml.NodeletParser.processNodelet(NodeletParser.java:123)
at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:105)
at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:102)
at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:72)
at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:51)
... 15 more
Caused by: com.ibatis.sqlmap.client.SqlMapException: Error initializing
JtaTransactionConfig while looking up UserTransaction
(javax.transaction.UserTransaction). Cause:
javax.naming.NoInitialContextException: Need to specify class name in
environment or system property, or as an applet parameter, or in an
application resource file: java.naming.factory.initial
at com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig.initialize(JtaTransactionConfig.java:50)
at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser$6.process(SqlMapConfigParser.java:306)
at com.ibatis.common.xml.NodeletParser.processNodelet(NodeletParser.java:121)
... 19 more
我已经在配置文件里配置了context.java.naming.factory.initial,而在这里还提示这个错误
关键看这里Error initializing JtaTransactionConfig while looking up
UserTransaction (javax.transaction.UserTransaction). Cause:
javax.naming.NoInitialContextException: Need to specify class name in
environment or system property, or as an applet parameter, or in an
application resource file: java.naming.factory.initial
问了一个朋友,他说在jvm里加上一个参数,测试一下
-Djava.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
运行通过
这个参数在:右键项目--Run as --Open Run Dialog--Arguments的VM arguments中添加即可