環(huán)境:
jboss-4.2.3.GA
spring2.5.6
去jboss官方下載jboss服務(wù)器,http://www.jboss.org/jbossas/downloads/。建議下載jboss-4.2.3.GA這個(gè)版本的jboss,個(gè)人感覺還是這個(gè)版本的jboss比較穩(wěn)定
解壓下載下來的jboss壓縮文件,筆者解壓到D:\jboss-4.2.3.GA
筆者以oracle數(shù)據(jù)庫來說明如何在jboss下配置jndi 以及整合spring
拷貝oracle-ds文件
去D:\jboss-4.2.3.GA\docs\examples\jca目錄下拷貝oracle-ds文件到D:\jboss-4.2.3.GA\server\default\deploy目錄下改名即可
大致內(nèi)容如下:
其他幾個(gè)屬性不做過多解釋
use-java-context:屬性默認(rèn)為true,如未配置該屬性或該屬性配置為true,那么jboss在啟動的時(shí)候jndi的名稱前會加上java: 這里我們jndi的名稱為KBSDS,那么未配置該屬性或該屬性為true的話,你在spring中使用jndi時(shí)指定的jndiName就應(yīng)該為java:KBSDS,若配置為false,那么jboss服務(wù)器不會為你加上java: 你在spring中jndiName應(yīng)當(dāng)配置為KBSDS,即與jndi-name屬性值等同。這里為了方便期間設(shè)置該屬性為false
拷貝oracle驅(qū)動
拷貝oracle驅(qū)動 class12.jar到j(luò)boss的如下目錄
D:\jboss-4.2.3.GA\lib
D:\jboss-4.2.3.GA\server\default\lib
切記數(shù)據(jù)庫驅(qū)動拷貝到D:\jboss-4.2.3.GA\server\default\lib目錄下,否則即使你jndi配置的再怎么正確都會報(bào)如下錯(cuò)誤,該錯(cuò)誤在jboss啟動的時(shí)候并不會報(bào)出,只有在正式遇數(shù)據(jù)庫進(jìn)行交互的時(shí)候才會報(bào)此錯(cuò)誤,大概錯(cuò)誤是這樣的。此處花了好長時(shí)間才解決。
在applicationContext.xml中配置如下信息:
其實(shí)這里的配置主要是根據(jù)jboss服務(wù)器啟動時(shí)控制臺給出的信息來配置的
設(shè)置use-java-context為false時(shí)控制臺給出的jndi信息
注意對比兩次控制臺分別打印的信息,從中很容易發(fā)現(xiàn),其實(shí)就是use-java-context屬性的作用。關(guān)于該屬性,大家可以去參看jboss的官方文檔。這里就不細(xì)說了。
到此jboss下配置jndi 以及整合spring已經(jīng)成功配置起來了,接下來就是一些細(xì)化了,大家可以去查詢jboss的關(guān)于jndi配置的文檔。
其實(shí)在jboss下配置jndi遠(yuǎn)遠(yuǎn)比在tomcat下配置jndi簡單的多。
總結(jié)下來就這幾步
拷貝jndi模板到server\default\deploy目錄下,并做修改,這里面模板文件均是以數(shù)據(jù)庫類型-ds.xml命名的。
拷貝數(shù)據(jù)庫驅(qū)動到\server\default\lib目錄和jboss安裝目錄\lib下即可。
jboss-4.2.3.GA
spring2.5.6
去jboss官方下載jboss服務(wù)器,http://www.jboss.org/jbossas/downloads/。建議下載jboss-4.2.3.GA這個(gè)版本的jboss,個(gè)人感覺還是這個(gè)版本的jboss比較穩(wěn)定
解壓下載下來的jboss壓縮文件,筆者解壓到D:\jboss-4.2.3.GA
筆者以oracle數(shù)據(jù)庫來說明如何在jboss下配置jndi 以及整合spring
拷貝oracle-ds文件
去D:\jboss-4.2.3.GA\docs\examples\jca目錄下拷貝oracle-ds文件到D:\jboss-4.2.3.GA\server\default\deploy目錄下改名即可
大致內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>KBSDS</jndi-name>
<connection-url>jdbc:oracle:thin:@192.168.4.243:1521:future</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<use-java-context>false</use-java-context>
<user-name>knowledge</user-name>
<password>knowledge</password>
<min-pool-size>5</min-pool-size>
<max-pool-size>20</max-pool-size>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>Oracle9i</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
jndi-name:不用多說了,當(dāng)然是為該jndi取一名稱這里使用KBSDS<datasources>
<local-tx-datasource>
<jndi-name>KBSDS</jndi-name>
<connection-url>jdbc:oracle:thin:@192.168.4.243:1521:future</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<use-java-context>false</use-java-context>
<user-name>knowledge</user-name>
<password>knowledge</password>
<min-pool-size>5</min-pool-size>
<max-pool-size>20</max-pool-size>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>Oracle9i</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
其他幾個(gè)屬性不做過多解釋
use-java-context:屬性默認(rèn)為true,如未配置該屬性或該屬性配置為true,那么jboss在啟動的時(shí)候jndi的名稱前會加上java: 這里我們jndi的名稱為KBSDS,那么未配置該屬性或該屬性為true的話,你在spring中使用jndi時(shí)指定的jndiName就應(yīng)該為java:KBSDS,若配置為false,那么jboss服務(wù)器不會為你加上java: 你在spring中jndiName應(yīng)當(dāng)配置為KBSDS,即與jndi-name屬性值等同。這里為了方便期間設(shè)置該屬性為false
拷貝oracle驅(qū)動
拷貝oracle驅(qū)動 class12.jar到j(luò)boss的如下目錄
D:\jboss-4.2.3.GA\lib
D:\jboss-4.2.3.GA\server\default\lib
切記數(shù)據(jù)庫驅(qū)動拷貝到D:\jboss-4.2.3.GA\server\default\lib目錄下,否則即使你jndi配置的再怎么正確都會報(bào)如下錯(cuò)誤,該錯(cuò)誤在jboss啟動的時(shí)候并不會報(bào)出,只有在正式遇數(shù)據(jù)庫進(jìn)行交互的時(shí)候才會報(bào)此錯(cuò)誤,大概錯(cuò)誤是這樣的。此處花了好長時(shí)間才解決。
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.jboss.util.NestedSQLException: Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Apparently wrong driver class specified for URL: class: oracle.jdbc.driver.OracleDriver, url: jdbc:oracle:thin:@192.168.4.243:1521:future); - nested throwable: (org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Apparently wrong driver class specified for URL: class: oracle.jdbc.driver.OracleDriver, url: jdbc:oracle:thin:@192.168.4.243:1521:future))
org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:238)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:374)
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
$Proxy67.managerLogin(Unknown Source)
com.future.knowledges.action.ManagerAction.execute(ManagerAction.java:62)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
配置spring配置文件org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:238)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:374)
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
$Proxy67.managerLogin(Unknown Source)
com.future.knowledges.action.ManagerAction.execute(ManagerAction.java:62)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在applicationContext.xml中配置如下信息:
<bean name="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>KBSDS</value>
</property>
</bean>
此種方式指定jndiName為KBSDS并未java:前綴,需要你手動在jboss的jndi配置文件中設(shè)置use-java-context屬性為fasle,若未設(shè)置該屬性或設(shè)置為true那么此處應(yīng)該是這樣子的<property name="jndiName">
<value>KBSDS</value>
</property>
</bean>
<bean name="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:KBSDS</value>
</property>
</bean>
需要你手動加上java:前綴后面跟jboss下配置的jndi的名稱<property name="jndiName">
<value>java:KBSDS</value>
</property>
</bean>
其實(shí)這里的配置主要是根據(jù)jboss服務(wù)器啟動時(shí)控制臺給出的信息來配置的
設(shè)置use-java-context為false時(shí)控制臺給出的jndi信息
11:13:34,250 INFO [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=ConnectionFactoryBinding,name=JmsXA' to JNDI name 'java:JmsXA'
11:13:34,359 INFO [WrapperDataSourceService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=KBSDS' to JNDI name 'KBSDS'
11:13:34,406 INFO [TomcatDeployer] deploy, ctxPath=/KBS, warUrl=
/deploy/KBS.war/
11:13:34,781 INFO [[/KBS]] Initializing Spring root WebApplicationContext
設(shè)置use-java-context為true或不設(shè)置時(shí)控制臺給出的jndi信息11:13:34,359 INFO [WrapperDataSourceService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=KBSDS' to JNDI name 'KBSDS'
11:13:34,406 INFO [TomcatDeployer] deploy, ctxPath=/KBS, warUrl=

11:13:34,781 INFO [[/KBS]] Initializing Spring root WebApplicationContext
11:25:15,921 INFO [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=ConnectionFactoryBinding,name=JmsXA' to JNDI name 'java:JmsXA'
11:25:15,984 INFO [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=KBSDS' to JNDI name 'java:KBSDS'
11:25:16,031 INFO [TomcatDeployer] deploy, ctxPath=/KBS, warUrl=
/deploy/KBS.war/
11:25:15,984 INFO [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=KBSDS' to JNDI name 'java:KBSDS'
11:25:16,031 INFO [TomcatDeployer] deploy, ctxPath=/KBS, warUrl=

注意對比兩次控制臺分別打印的信息,從中很容易發(fā)現(xiàn),其實(shí)就是use-java-context屬性的作用。關(guān)于該屬性,大家可以去參看jboss的官方文檔。這里就不細(xì)說了。
到此jboss下配置jndi 以及整合spring已經(jīng)成功配置起來了,接下來就是一些細(xì)化了,大家可以去查詢jboss的關(guān)于jndi配置的文檔。
其實(shí)在jboss下配置jndi遠(yuǎn)遠(yuǎn)比在tomcat下配置jndi簡單的多。
總結(jié)下來就這幾步
拷貝jndi模板到server\default\deploy目錄下,并做修改,這里面模板文件均是以數(shù)據(jù)庫類型-ds.xml命名的。
拷貝數(shù)據(jù)庫驅(qū)動到\server\default\lib目錄和jboss安裝目錄\lib下即可。