Spring/JNDI-Problem

pizza1234

Erfahrenes Mitglied
Hallo,
ich habe meine Anwendung gerade so umgestellt, dass ich in der context.xml meine JNDI-Resource festlege, statt in der server.xml. Leider bekomme ich so eine NameNotFoundException!
Code:
used by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1337)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
        ... 61 more
Caused by: javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
        at org.apache.naming.NamingContext.lookup(NamingContext.java:769)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
        at org.apache.naming.SelectorContext.lookup(SelectorContext.java:136)
        at javax.naming.InitialContext.lookup(InitialContext.java:392)
        at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:155)
        at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:88)
        at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:153)
        at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178)
        at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
        at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105)
        at org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:200)
        at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:186)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368)
        at org.springf


context.xml
Code:
<Context>

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
	
    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
	<!--
   <ResourceLink name="jdbc/mysql" global="jdbc/mysql"
                  type="javax.sql.DataSource"/> 
                  
                  
                  -->
                  
     <Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" 
              description="Shared pool of JDBC connections"
              factory="org.apache.commons.dbcp.BasicDataSourceFactory"
              username="test"
              driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://192.168.1.205:3306/etss"
              password="workxl"
              maxActive="30"
              minIdle="0"
              maxIdle="30"
              maxWait="60"
              removeAbandoned="true"
              removeAbandonedTimeout="120"
              logAbandoned="true"
              testOnBorrow="false"
              testOnReturn="true"
              timeBetweenEvictionRunsMillis="60000"
              numTestsPerEvictionRun="5"
              minEvictableIdleTimeMillis="30000"
              testWhileIdle="true"
              validationQuery="select now()" />
      
</Context>

dataBaseContext.xml (spring)

Code:
...
	<jee:jndi-lookup id="dataSource" jndi-name="jdbc/mysql"  />
...

Als alles noch in der server.xml stand, funktionierte jndi wunderbar!
Weiß einer, warum das so nicht geht?

Grüße,
Peter
 
Hm... bist du dir sicher, dass die context.xml ausgewertet wird? Wo legst du die context.xml hin? Muss die DataSource unbedingt in den Server? Warum nicht direkt in der Applikation als Spring Bean deklarieren?

Gruß
Ollie
 
Hallo,

wenn Du die context.xml verwendest, beziehen sich die Resourcen auch nur auf den Context der jeweiligen Web-App (und werden nicht global definiert, wie in der server.xml). Die Web-App benutzt dann eine Art eigenen JNDI-Baum/Context, der den Prefix java:comp/env hat. Versuch den doch mal anzugeben, vielleicht klappts ja dann.
Code:
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/mysql"  />

hth
THMD
 
Hi,

meine Context.xml liegt im Meta-Inf-Verzeichnis und wird auch ausgelesen!
Die DataSource soll auf jeden Fall auf dem Server liegen. Ich hab es gerade auch mal mit einer SpringBean versucht, das klappt einwandfrei! Wenn ich, wie ursprünglich den ResourceLink in der Context.xml aktiviere, geht es ja auch!
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/mysql" />
Das habe ich auch schon ausprobiert, geht aber leider auch nicht. Komischerweise funktioniert es bei einem Kollegen im Tomcat 6.0.18 wunderbar, wenn man die App über die Manager-Oberfläche des Tomcat deployed. Ich verwende noch ne 5.5er version, vielleicht liegt es daran?

Grüße,
Peter
 
Hallo,

.. Komischerweise funktioniert es bei einem Kollegen im Tomcat 6.0.18 wunderbar, wenn man die App über die Manager-Oberfläche des Tomcat deployed. Ich verwende noch ne 5.5er version, vielleicht liegt es daran?...

sollte eigentlich nicht an den Versionen liegen. Hast Du mal einen neuinstallierten Tomcat 5.5 probiert? Kommst Du über einen "normalen" JNDI-Aufruf an die DataSource ran, oder meldet er da auch einen Fehler?

Grüße
THMD
 
Hi,
ein neuinstallierter Tomcat ist mir momentan zu aufwendig, da der 5.5er Tomcat meine Entwicklungskiste ist. Außerdem wird ein Gentoosystem verwendet, mit dem ich mich nicht so gut auskenne.Einen normalen "JNDI-Aufruf" kann ich ja leider nicht machen, da die ganze App wegen des Fehlers nicht startet! Ich stell das Problem jetzt erst mal zurück und werde den Aufruf jetzt wieder direkt in der server.xml des Tomcat machen. Es wäre halt schön gewesen, wenn man die App zum Testen weitergeben könnte, ohne den Tomcat extra dafür konfigurieren zu müssen!

Grüße,
Peter
 
Hallo,

ich hab das Beispiel mal an einer simplen Applikation auf einem Tomcat 5.5.27 ausprobiert. Wenn ich Deinen ursprünglichen jndi-lookup verwende, kommt bei mir auch die NamingException "Name jdbc is not bound in this context". Nachdem ich das ganze auf
Code:
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/mysql" />
umgestellt hatte, funktionierte es ohne Probleme. Du hattest ja erwähnt, dass das bei Dir auch nicht funktioniert hat - kam da eine andere Exception als "Name jdbc is not bound in this context"?

Ich würde jetzt mal behaupten, dass eventuell was mit dem Tomcat nicht stimmt bzw. ein Deployment mit falschen Nutzerrechten ausgeführt wird. Da er bei dir auf Gentoo läuft, nutzt du bestimmt die installierte/mitgeliefert Variante, die die Tomcat-Verzeichnisse überall im System verteilt. Schau doch mal nach, ob Deine context.xml überhaupt richtig deployed wurde. Sie sollte unter /etc/tomcat[was auch immer]/Catalina/localhost/[Name der Anwendung].xml liegen. Wenn sie da ist, schmeiss sie mal raus und lösche auch mal den Inhalt des work-Verzeichnisses (/var/run/tomcat5.5, /var/lib/tomcat5.5 oder so, das machen die Distributionen (ich hab momentan nur ein Ubuntu da) teilweise anders) und deploye das WAR nochmal neu.

Falls du Eclipse WTP nutzt - zumindest auf Windows hält das standardmäßig seine eigene Konfiguration (also unabhängig von den Server-Verzeichnissen). Da könnte es helfen einfach mal einen neuen Server zu definieren und es so nochmal zu versuchen.

Alles in allem - vom Grundprinzip her sollte es laufen (und tut es auch).

Grüße,
THMD
 
Wenn ich mich richtig erinnere gabs von Tomcat 5 auf 6 einige Änderungen an dem JNDI Kram. D.h. ihr tut gut daran eine möglichst einheitliche Infrastruktur aufzubauen und die gleichen Tomcat Versionen zu nutzen. Wir hatten schon oft Probleme damit, sogar in Minorreleases (Tomcat 6.0.13 VS. 6.0.14)

REINHAUN!
 
Hi,
ich werde mir das demnächst mal genauer anschauen, momentan hab ich dafür leider keine Zeit! Vielen Dank erstmal für eure Hilfe!!

Grüße,
Peter
 

Neue Beiträge

Zurück