Je viens de rencontrer un problème suite à l'utilisation d'une DataSource. Une erreur courante que je n'arrive pourtant pas à résoudre :
javax.naming.NameNotFound Exception : le nom jdbc n'est pas lié à ce contexte.
Voici mon code pour paramétrer la datasource :
Mon fichier web.xml :
Mon fichier context.xml :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 <web-app version="2.4" 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"> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>2</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <resource-ref> <description>Pool de connection</description> <res-ref-name>jdbc/monAppli</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> <session-config><session-timeout> 30 </session-timeout></session-config><welcome-file-list><welcome-file> index.jsp </welcome-file></welcome-file-list> </web-app>
Mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <Context docBase="\monAppli" path="/monAppli" useNaming="true"> <ResourceLink global="jdbc/monAppli" name="jdbc/monAppli" type="javax.sql.DataSource"/> <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="8" maxIdle="8" maxWait="10000" name="jdbc/monAppli" password="monpassword" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/mabdd?autoReconnect=true" username="monusername"/> </Context>
En feuilletant les forums et le web, j'ai trouvé des raisons possibles à cette erreur, mais aucune correction n'a résolu ce problème (j'ai mis useNaming à true, j'ai utilisé username et non user, etc...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public abstract class BaseDAO { private static final String JNDI_DATASOURCE = "java:comp/env/jdbc/monAppli"; private DataSource dataSource; public BaseDAO() { super(); try { Context ctx = new InitialContext(); this.dataSource = (DataSource) ctx.lookup(JNDI_DATASOURCE); } catch (NamingException ex) { ex.printStackTrace(); } } public void closeResources(ResultSet rset, Statement stmt, Connection conn) { if (rset != null) { try { rset.close(); } catch (SQLException ex) { ex.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException ex) { ex.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } public Connection getConnection() { Connection conn = null; try { conn = this.dataSource.getConnection(); } catch (SQLException ex) { ex.printStackTrace(); } return conn; } }
Je ne vois pas ce qui cloche mais j'ai quelques hypothèses :
- la déclaration de la DataSource serait mal placée (mauvais niveau) dans le fichier web.xml ?
- il manquerait le paramètre <Context /> dans le fichier server.xml ?
Seulement, si cette deuxième hypothèse s'avère être la cause de l'erreur alors je serais déçue. J'ai configuré la DataSource dans le fichier context.xml au lieu du fichier server.xml de Tomcat afin de ne pas avoir à faire de modif lorsque je déploierai mon application sur un autre Tomcat que celui que j'utilise en développement avec NetBeans.
Quelqu'un a la recette qui gagne ?
Partager