2013-02-12 7 views
5

Chcę użyć źródła danych JNDI dostarczonego przez Tomcat w aplikacji opartej na źródle. Używam puli Tomcat 7. Próbowałem skonfigurować zgodnie z opisem here.Nie można użyć źródła danych JNDI dostarczonego przez Tomcat na wiosnę?

skonfigurowanego server.xml Tomcat:

<GlobalNamingResources> 
    <Resource name="jdbc/ApsuserAtAzistst" 
       auth="Container" 
       type="org.apache.tomcat.jdbc.pool.DataSource" 
       driverClassName="oracle.jdbc.OracleDriver" 
       url="jdbc:oracle:thin:@10.0.153.10:1525:AZISTST" 
       username="APSUSER" 
       password="PASSWORDOFAPSUSER" 
       initialSize="1" 
       minIdle="1" 
       maxIdle="1" 
       maxActive="3" 
       maxWait="1000" 
       validationQuery="select 1 from dual" 
       jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport(threshold=1500)" 
      /> 
    </GlobalNamingResources> 

stworzony META-INF \ context.xml o treści:

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <ResourceLink name="jdbc/ApsuserAtAzistst" 
        global="jdbc/ApsuserAtAzistst" 
        type="org.apache.tomcat.jdbc.pool.DataSource"/> 
</Context> 

i skonfigurowany applicationContext.xml

<beans profile="dev,test,default"> 
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="java:comp/env/jdbc/ApsuserAtAzistst"/> 
    </bean> 
</beans> 

kiedy uruchom aplikację Otrzymuję komunikat o błędzie:

SEVERE: Exception processing Global JNDI Resources 
javax.naming.NamingException: Cannot create resource instance 
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:146) 
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:843) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154) 
    at org.apache.naming.NamingContextBindingsEnumeration.nextElementInternal(NamingContextBindingsEnumeration.java:119) 
    at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:73) 
    at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:36) 
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:140) 
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:147) 
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:112) 
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.lifecycleEvent(GlobalResourcesLifecycleListener.java:84) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402) 
    at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:347) 
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:725) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.startup.Catalina.start(Catalina.java:684) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456) 

Wszystko działa przy zmianie applicationContext.xml do:

<beans profile="dev,test,default"> 
    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> 
     <property name="driverClassName" value="oracle.jdbc.OracleDriver"/> 
     <property name="url" value="jdbc:oracle:thin:@10.0.153.10:1525:AZISTST"/> 
     <property name="username" value="APSUSER"/> 
     <property name="password" value="PASSWORDOFAPSUSER"/> 
     <property name="initialSize" value="1"/> 
     <property name="minIdle" value="1"/> 
     <property name="maxIdle" value="1"/> 
     <property name="maxActive" value="3"/> 
     <property name="maxWait" value="1000"/> 
     <property name="validationQuery" value="select 1 from dual"/> 
     <property name="jdbcInterceptors" 
        value="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport(threshold=1500)"/> 
    </bean> 
</beans> 

Ale chcę skonfigurować JNDI źródła danych w Tomcat i używać go.

Odpowiedz

8

Powodem było to, że brakowało fabryki = "org.apache.tomcat.jdbc.pool.DataSourceFactory". Prawidłowa definicja zasobu musi być

<GlobalNamingResources> 
    <Resource name="jdbc/ApsuserAtAzistst" 
       auth="Container" 
       type="javax.sql.DataSource" 
       factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
       driverClassName="oracle.jdbc.OracleDriver" 
       url="jdbc:oracle:thin:@10.0.153.10:1525:AZISTST" 
       username="APSUSER" 
       password="PASSWORDOFAPSUSER" 
       initialSize="1" 
       minIdle="1" 
       maxIdle="1" 
       maxActive="3" 
       maxWait="1000" 
       validationQuery="select 1 from dual" 
       jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport(threshold=1500)" 
      /> 
    </GlobalNamingResources>