2 votes

javax.naming.NameNotFoundException : Le nom [jdbc/FsEDBUser] n'est pas lié à ce contexte.

J'ai déjà configuré des ressources JNDI, mais je rencontre un problème que je ne suis pas sûr de savoir comment corriger sur mon ordinateur. apache-tomcat-8.0.36 serveur.

Mon context.xml contient les éléments suivants :

<ResourceLink name="jdbc/FsEDBAdmin" global="jdbc/FsEDBAdmin" type="javax.sql.DataSource" />
<ResourceLink name="jdbc/FsEDBUser" global="jdbc/FsEDBUser" type="javax.sql.DataSource" />
<Resource name="jdbc/FsEDBAdmin" auth="Container"
          type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
          url="jdbc:postgresql://location"
          username="user_admin" password="pass"
          maxActive="20" maxIdle="10" maxWait="-1"/>

<Resource name="jdbc/FsEDBUser" auth="Container"
          type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
          url="jdbc:postgresql://location"
          username="user_user" password="pass"
          maxActive="20" maxIdle="10" maxWait="-1"/>

Mon web.xml :

<resource-ref>
    <description>Admin Connection</description>
    <res-ref-name>jdbc/FsEDBAdmin</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
    <description>User Connection</description>
    <res-ref-name>jdbc/FsEDBUser</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

J'utilise également ces connexions pour définir une Realm pour l'authentification : server.xml :

<Realm className="org.apache.catalina.realm.LockOutRealm">
    <!-- This Realm uses the UserDatabase configured in the global JNDI
         resources under the key "UserDatabase".  Any edits
         that are performed against this UserDatabase are immediately
         available for use by the Realm.  -->
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
           resourceName="UserDatabase"/>
    <Realm className="org.apache.catalina.realm.DataSourceRealm"
        digest="digest_method" dataSourceName="jdbc/FsEDBAdmin" userTable="schema.table_name"
        userNameCol="name_col" userCredCol="pass_col"
        userRoleTable="schema.table_name" roleNameCol="rolename_col"
        localDataSource="true"/>
  </Realm>

Mais lorsque je lance mon application, j'obtiens l'erreur mentionnée dans le titre. Je peux donner une trace complète de la pile si on me le demande.

J'aimerais ajouter que cela fonctionnait déjà à un moment donné et que le changement le plus récent a été l'utilisation de l'icône de l'utilisateur. Realm pour l'authentification. Il est évident que j'ai fait une erreur en définissant ces ressources à un endroit ou à un autre, donc une autre paire d'yeux pour me dire où cela se trouve serait grandement appréciée. Merci.

EDIT : Voici comment j'appelle la ressource :

import path.to.CommonTools;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;

/**
 *
 * @author Michael Potts
 */
public enum Resource {
    INSTANCE;

private static BasicDataSource basicAdmin = null;
private static BasicDataSource basicUser = null;
private static final String JNDI_PREFIX = "java:/comp/env";
private static final String ADMIN_DB_NAME = "jdbc/FsEDBAdmin";
private static final String USER_DB_NAME = "jdbc/FsEDBUser";

/**
 * Secure method that gives a connection from the pool for an Admin user
 * @return java.sql.Connection
 * @throws Exception Throws if Context isn't properly defined on Server 
 */
public static Connection getAdminConnection() throws Exception {
    try {
        if(basicAdmin == null) { //1st time load
            Context dbContext = (Context) new InitialContext().lookup(JNDI_PREFIX);
            basicAdmin = (BasicDataSource) dbContext.lookup(ADMIN_DB_NAME);
        }
        return basicAdmin.getConnection();
    } catch (NamingException | SQLException e) {
        throw new RuntimeException("\nInvalid JNDI resource: " + ADMIN_DB_NAME + CommonTools.getStackTrace(e));
    }
}

/**
 * Secure method that gives a connection from the pool for a standard user
 * @return java.sql.Connection
 * @throws Exception Throws if Context isn't properly defined on Server 
 */
public static Connection getUserConnection() throws Exception {
    try {
        if(basicUser == null) { //1st time load
            Context dbContext = (Context) new InitialContext().lookup(JNDI_PREFIX);
            basicUser = (BasicDataSource) dbContext.lookup(USER_DB_NAME);
        }
        return basicUser.getConnection();
    } catch (NamingException | SQLException e) {
        throw new RuntimeException("\nInvalid JNDI resource: " + USER_DB_NAME + CommonTools.getStackTrace(e));
    }
}
}

1voto

Susannah Potts Points 659

Donc la solution pour moi était de supprimer TOUTES LES ENTRES sauf la base Resource définitions dans context.xml . Il s'agit notamment de retirer ResourceLink les entrées. Donc si vous avez tout essayé et que vous obtenez cette erreur comme moi, ignorez toute la documentation et définissez simplement dans Context.xml.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X