web-dev-qa-db-fra.com

javax.naming.NameNotFoundException: le nom n'est pas lié dans ce contexte. Impossible à trouver

J'essaie de savoir pourquoi mon application Web jette un 

javax.naming.NameNotFoundException: Name [flexeraDS] is not bound in this Context. Unable to find [flexeraDS].

quand une sœur dont je copie la configuration fonctionne silencieusement.

J'ai:

  1. créer une nouvelle persistance à partir de netbeans en cliquant avec le bouton droit de la souris et en sélectionnant "nouvelle persistance", peu m'importe les valeurs réelles que je donne mais il me faut juste que le fichier persistence.xml soit créé dans le bon répertoire.
  2. édité mon context.xml comme ci-dessous, correspondant à celui du projet frère
  3. modifié mon fichier web.xml afin qu'il contienne une ressource DataSource comme indiqué ci-dessous
  4. a modifié mon persistence.xml comme ci-dessous, en faisant correspondre à nouveau les mêmes valeurs que celles du projet frère.
  5. ajouté toutes les bibliothèques présentes dans l'autre projet dans le dossier lib du mien et les ajoutant aussi de NetBeans pour être correctement placées dans war.

context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/PetLogin">
  <ResourceLink global="ds/flexeraDS" name="ds/flexeraDS" type="javax.sql.DataSource"/>
</Context>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app ....>
<resource-ref>
        <description>DB Connection</description>
        <res-ref-name>ds/flexeraDS</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
</web-app>

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
             xmlns="http://Java.Sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://Java.Sun.com/xml/ns/persistence http://Java.Sun.com/xml/ns/persistence/persistence_1_0.xsd ">
    <persistence-unit name="flexerajpa">
        <provider>org.Eclipse.persistence.jpa.PersistenceProvider</provider>
        <non-jta-data-source>Java:/comp/env/ds/flexeraDS</non-jta-data-source>
        <properties>

            <property name="eclipselink.ddl-generation" value="create-tables" />
            <property name="eclipselink.ddl-generation.output-mode"
                      value="database" />
            <property name="eclipselink.weaving" value="static" />
            <property name="eclipselink.logging.level" value="WARNING" />
        </properties>
    </persistence-unit>
</persistence>

Maintenant, mon projet syster parvient quelque peu à créer son dossier de base de données dans Apache-Tomcat-7.0.40/bin/exampleDB au démarrage, alors que le mien ne le crée pas et génère une erreur comme ci-dessus.

Le code où l'erreur est renvoyée est la première fois que je me connecte à la base de données:

EntityManager entityManager = PersistenceProvider.createEntityManager();

où la classe PersistenceProvider est:

public final class PersistenceProvider
{

    private static Map<String, Object> lOptions = new HashMap<String, Object>();

    static
    {
        lOptions.put(PersistenceUnitProperties.CACHE_SHARED_DEFAULT, "false");
    }
    private static EntityManagerFactory factory = Persistence
            .createEntityManagerFactory("flexerajpa", lOptions);

    private PersistenceProvider()
    {
    }

    /**
     * @return
     */
    public static EntityManager createEntityManager()
    {
        return factory.createEntityManager();
    }

    /**
     * @return
     */
    public static Metamodel getMetamodel()
    {
        return factory.getMetamodel();
    }
}

Je n'ai plus de raisons pour cela .. si quelqu'un a une suggestion à faire ... Merci

16
dendini

Ok découvert que le fichier Tomcat server.xml doit également être configuré pour que la source de données fonctionne. Alors ajoutez simplement:

<Resource 
auth="Container" 
driverClassName="org.Apache.derby.jdbc.EmbeddedDriver" 
maxActive="20" 
maxIdle="10" 
maxWait="-1" 
name="ds/flexeraDS" 
type="javax.sql.DataSource" 
url="jdbc:derby:flexeraDB;create=true" 
  />
12
dendini

Vous pouvez aussi ajouter

<Resource 
auth="Container" 
driverClassName="org.Apache.derby.jdbc.EmbeddedDriver" 
maxActive="20" 
maxIdle="10" 
maxWait="-1" 
name="ds/flexeraDS" 
type="javax.sql.DataSource" 
url="jdbc:derby:flexeraDB;create=true" 
/> 

sous fichier META-INF/context.xml (ce sera uniquement au niveau de l'application).

5
Ritesh Kaushik

ugh, juste pour parcourir mon propre cas, qui a donné à peu près la même erreur - dans la déclaration de ressource (server.xml), assurez-vous de NE PAS omettre driverClassName, et que par ex. pour Oracle, il s'agit de "Oracle.jdbc.OracleDriver" et du fichier JAR correct (par exemple, ojdbc14.jar) existe dans% CATALINA_HOME%/lib

0
hello_earth

Dans Tomcat 8.0.44, j’avais fait ceci: créez le JNDI sur le fichier server.xml de Tomcat entre la balise "GlobalNamingResources" Par exemple:

<GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
  <!-- Other previus resouces -->
    <Resource auth="Container" driverClassName="org.postgresql.Driver" global="jdbc/your_jndi" 
    maxActive="100" maxIdle="20" maxWait="1000" minIdle="5" name="jdbc/your_jndi" password="your_password" 
    type="javax.sql.DataSource" url="jdbc:postgresql://localhost:5432/your_database?user=postgres" username="database_username"/>
  </GlobalNamingResources>
Dans votre application Web, vous avez besoin d’un lien vers cette ressource (ResourceLink):

 project explore

<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true" >
		 <ResourceLink name="jdbc/your_jndi"
	 				global="jdbc/your_jndi"
	 				auth="Container"
	 				type="javax.sql.DataSource" />
</Context>

Donc, si vous utilisez Hiberte avec spring, vous pouvez lui dire d'utiliser le JNDI dans votre persistence.xml

 persistence.xml location

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://Java.Sun.com/xml/ns/persistence http://Java.Sun.com/xml/ns/persistence/persistence_2_0.xsd"
	version="2.0" xmlns="http://Java.Sun.com/xml/ns/persistence">
	<persistence-unit name="UNIT_NAME" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>

		<properties>
			<property name="javax.persistence.jdbc.driver" 		value="org.postgresql.Driver" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL82Dialect" />
			
			<!--  <property name="hibernate.jdbc.time_zone" value="UTC"/>-->
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="false" />
			<property name="hibernate.format_sql" value="true"/>     
		</properties>
	</persistence-unit>
</persistence>

Donc, dans votre spring.xml, vous pouvez le faire:

<bean id="postGresDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
			<property name="jndiName" value="Java:comp/env/jdbc/your_jndi" />
		</bean>
   		
        <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
              <property name="persistenceUnitName" value="UNIT_NAME" />
              <property name="dataSource" ref="postGresDataSource" />
              <property name="jpaVendorAdapter"> 
              	 	<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
              </property>
        </bean>
Regardez au-dessus de ce bean entityManagerFactory qui fait référence à votre UNIT_NAME configuré à la persistance xml et le bean postGresDataSource a une propriété qui pointe vers votre ressource JNDI dans Tomcat.

<property name="jndiName" value="Java:comp/env/jdbc/your_jndi" />

Dans cet exemple, j’ai utilisé spring avec xml, mais vous pouvez le faire par programmation si vous préférez.

Ça y est, j'espère aidé.

0
Rafael Rocha