J'essaie d'accéder à une variable __ JNDI datasource
dans Tomcat à l'aide de la balise jee jndi-lookup
de Spring.
L'exception indique que je n'ai pas enregistré ma datasource
correctement, mais je suis incapable de comprendre pourquoi.
Voici mon code: -
service-context.xml : -
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee.xsd">
<context:component-scan base-package="spitter" />
<mvc:annotation-driven />
<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/spitterDS" resource-ref="true" />
</beans>
webapp/META-INF/context.xml : -
<Context path="/spitter" reloadable="true" cachingAllowed="false" antiResourceLocking="true">
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/spitterDS" auth="Container" type="org.Apache.commons.dbcp.BasicDataSource"
maxActive="100" maxIdle="30" maxWait="10000" username="root" password="password"
driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/spitter" />
</Context>
web.xml : -
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://Java.Sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>Spitter</display-name>
<resource-ref>
<description>Spitter DS</description>
<res-ref-name>jdbc/spitterDS</res-ref-name>
<res-type>org.Apache.commons.dbcp.BasicDataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:service-context.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
et enfin,
MainController.Java : -
package spitter.mvc;
import Java.sql.Connection;
import Java.sql.SQLException;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/")
public class MainController {
@Resource(name="dataSource")
private DataSource dataSource;
@RequestMapping(method = RequestMethod.GET)
public String showHome(Model model) throws SQLException{
Connection con = dataSource.getConnection();
return "spitter";
}
}
J'utilise Tomcat 7
dans Eclipse kepler
pour les développeurs JEE. L'exception lorsque je démarre le serveur Tomcat dans Eclipse: -
org.springframework.beans.factory.BeanCreationException: Erreur lors de la création d'un bean avec le nom 'mainController': L'injection des dépendances de la ressource a échoué; L'exception imbriquée est org.springframework.beans.factory.BeanCreationException: Erreur lors de la création du bean avec le nom 'dataSource': L'invocation de la méthode init a échoué; L'exception imbriquée est javax.naming.NameNotFoundException: le nom [jdbc/spitterDS] n'est pas lié à ce contexte. Impossible de trouver [jdbc].
Je suppose que j'ai fait une faute de frappe quelque part mais que je ne la trouve pas. S'il vous plaît aider!
"/jdbc/spitterDS"
n'est pas égal à "jdbc/spitterDS"
.
Dans le fichier service-context.xml
,
Changement
<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/spitterDS" resource-ref="true" />
À
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/spitterDS" resource-ref="true" />
Modifier:
Erreur lors de la création d'un bean avec le nom 'dataSource':
Selon la documentation:
... dans l'annotation
@Resource(name="jdbc/Foo") DataSource ds;
, le nom JNDI global estjdbc/Foo
.
...
L'annotation @Resource dans le code de l'application ressemble à ceci:@Resource(name="jdbc/helloDbDs") javax.sql.DataSource ds;
Changement:
@Resource(name="dataSource")
private DataSource dataSource;
À:
@Resource(name="jdbc/spitterDS")
private DataSource dataSource;
Report To: Utilisation de l'interface de dénomination et de répertoire Java .
J'ai fait face à ce problème aussi, dans mon cas, j'ai raté un journal WARN de Tomcat, je n'ai pas inclus le pot pour
org.Apache.commons.dbcp.BasicDataSourceFactory
commons-dbcp-x.x.jar
commons-pool-x.x.x.jar
commons-lang-x.x.x.jar
Corrigé, tout se passe bien.
Dans mon cas, j'ai dû augmenter le paramètre dans my.cnf
max_connections = 120
J'ai l'impression que toute mauvaise configuration de mysql donnera ce message d'erreur.
J'ai la même erreur exacte. Mais pour moi, suivre était absent de la ressource
driverClassName="Oracle.jdbc.OracleDriver"
Après avoir ajouté cela, tout fonctionnait parfaitement.