Bonjour,
je m'arrache les cheveux avec JNDI depuis ce matin, et j'ai enfin trouvé mon problème. Sauf que du coup je ne suis plus sûr de comprendre comment marche le bidule...
Je m'explique.
J'ai une application que je fais tourner en phase de dev sur un serveur Tomcat.
Je dispose d'une ressource jndi déclarée dans le fichier context.xml auquel j'accède directement via l'interface d'eclipse :
Code :
Resource name="jdbc/plouf"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@xx:1557:PLOUF"
username="xx" password="xx" maxActive="20" maxIdle="10"
maxWait="-1"/
Dans mon code j'y accède simplement via les lignes suivantes :
Code :
initContext = new InitialContext();
envContext = (Context)initContext.lookup("java:comp/env");
ds = (DataSource)envContext.lookup("jdbc/plouf");
conn = ds.getConnection();
Et ça marche. J'ai donc ensuite essayé de faire tourner le war sur glassfish.
J'ai donc commencé par créer ma ressource jndi sur le serveur (pool + ressource), et j'ai déployé le war quand soudain paf, NameNotFoundException, No object bound to name java:comp/env/jdbc/plouf
Pour que ça marche j'ai dû modifier mon code source :
Code :
initContext = new InitialContext();
ds = (DataSource)initContext.lookup("jdbc/plouf");
conn = ds.getConnection();
Et ma question finale : pourquoi ai-je dû retirer mon préfixe java:comp/env, sachant que, du coup, mon war ne trouve plus la ressource sur Tomcat(NameNotFoundException: Le Nom jdbc n'est pas lié à ce Contexte)
Bref, j'aimerai bien pouvoir packager mon bidule pour qu'il marche bien partout...
Si quelqu'un voulait éclairer mes petites lanternes, je lui serai très reconnaissant
Merci !
# Faire les 2 dans un try/catch
Posté par allcolor (site web personnel) . Évalué à 3.
initContext = new InitialContext();
try {
envContext = (Context)initContext.lookup("java:comp/env");
ds = (DataSource)envContext.lookup("jdbc/plouf");
}
catch (Exception e) {
ds = (DataSource)initContext.lookup("jdbc/plouf");
}
conn = ds.getConnection();
[^] # Re: Faire les 2 dans un try/catch
Posté par cho7 (site web personnel) . Évalué à 2.
[^] # Re: Faire les 2 dans un try/catch
Posté par allcolor (site web personnel) . Évalué à 2.
J'ai vu ce pattern partout ;) genre dans cayenne :
http://www.koders.com/java/fid80E31A1D172EB01EC24BF19D0B6278(...)
/* ====================================================================
*
* The ObjectStyle Group Software License, version 1.1
* ObjectStyle Group - http://objectstyle.org/
*
* Copyright (c) 2002-2004, Andrei (Andrus) Adamchik and individual authors
* of the software. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if any,
* must include the following acknowlegement:
* "This product includes software developed by independent contributors
* and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
* or promote products derived from this software without prior written
* permission. For written permission, email
* "andrus at objectstyle dot org".
*
* 5. Products derived from this software may not be called "ObjectStyle"
* or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
* names without prior written permission.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals and hosted on ObjectStyle Group web site. For more
* information on the ObjectStyle Group, please see
* <http://objectstyle.org/>.
*/
package org.objectstyle.cayenne.conf;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.apache.log4j.Level;
import org.objectstyle.cayenne.access.QueryLogger;
/** Looks up DataSource objects via JNDI.
*
* @author Andrei Adamchik
*/
public class JNDIDataSourceFactory implements DataSourceFactory {
protected Configuration parentConfig;
public JNDIDataSourceFactory() throws Exception {
}
/** Returns DataSource object corresponding to
location
.* Location is expected to be a path mapped in JNDI InitialContext. */
public DataSource getDataSource(String location) throws Exception {
return getDataSource(location, Level.DEBUG);
}
public void initializeWithParentConfiguration(Configuration conf) {
this.parentConfig = conf;
}
public DataSource getDataSource(String location, Level logLevel) throws Exception {
if (logLevel == null) {
logLevel = Level.DEBUG;
}
try {
QueryLogger.logConnect(logLevel, location);
Context initCtx = new InitialContext();
DataSource ds;
try {
Context envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource) envCtx.lookup(location);
}
catch (NamingException namingEx) {
// try looking up the location directly...
ds = (DataSource) initCtx.lookup(location);
}
QueryLogger.logConnectSuccess(logLevel);
return ds;
}
catch (Exception ex) {
QueryLogger.logConnectFailure(logLevel, ex);
throw ex;
}
}
}
Alors crade ou pas, c'est comme ça ;)
[^] # Re: Faire les 2 dans un try/catch
Posté par allcolor (site web personnel) . Évalué à 2.
Les lignes que je voulais mettre en évidence:
Context initCtx = new InitialContext();
DataSource ds;
try {
Context envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource) envCtx.lookup(location);
}
catch (NamingException namingEx) {
// try looking up the location directly...
ds = (DataSource) initCtx.lookup(location);
}
[^] # Re: Faire les 2 dans un try/catch
Posté par cho7 (site web personnel) . Évalué à 3.
[^] # Re: Faire les 2 dans un try/catch
Posté par cho7 (site web personnel) . Évalué à 1.
pénible, mais au moins ca marche...
[^] # Re: Faire les 2 dans un try/catch
Posté par allcolor (site web personnel) . Évalué à 3.
[^] # Re: Faire les 2 dans un try/catch
Posté par cho7 (site web personnel) . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.