it-swarm.com.de

javax.naming.NameNotFoundException: Der Name ist in diesem Kontext nicht gebunden. Kann nicht finden

Ich versuche herauszufinden, warum meine Webanwendung eine 

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

wenn eine schwester eine kopiert, von der ich die konfiguration leise laufe.

Ich habe:

  1. erstellen Sie von netbeans eine neue Persistenz, indem Sie mit der rechten Maustaste klicken und "Neue Persistenz" auswählen. Ich interessiere mich nicht für die tatsächlichen Werte, die ich gebe, aber ich muss nur die persistence.xml-Datei im richtigen Verzeichnis erstellen.
  2. bearbeitete meine context.xml-Datei wie unten beschrieben, die mit der aus dem laufenden Schwesterprojekt übereinstimmt
  3. hat meine web.xml so bearbeitet, dass sie eine Ressource-Datenquelle enthält (siehe unten)
  4. bearbeitete meine persistence.xml wie unten beschrieben wieder, wobei dieselben Werte wie beim Schwesterprojekt verwendet wurden.
  5. fügte alle Bibliotheken hinzu, die im anderen Projekt vorhanden waren, im lib-Ordner von mir und fügte sie auch aus NetBeans hinzu, um korrekt in den Krieg eingefügt zu werden.

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>

Nun schafft es mein syster-Projekt some-how, seinen Datenbankordner in Apache-Tomcat-7.0.40/bin/exampleDB beim Start zu erstellen, während meines nicht erstellt wird, und gibt einen Fehler wie oben beschrieben aus.

Der Code, in dem der Fehler ausgegeben wird, ist das erste Mal, dass ich eine Verbindung zur Datenbank herstelle:

EntityManager entityManager = PersistenceProvider.createEntityManager();

wo sich die PersistenceProvider-Klasse befindet:

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();
    }
}

Ich habe keine möglichen Gründe dafür ... wenn jemand einen Vorschlag hat . Vielen Dank

16
dendini

Ok herausgefunden, dass die Tomcat-Datei server.xml ebenfalls konfiguriert werden muss, damit die Datenquelle funktioniert. Also einfach hinzufügen:

<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

Sie können auch hinzufügen

<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" 
/> 

unter META-INF/context.xml-Datei (Dies gilt nur für die Anwendungsebene).

5
Ritesh Kaushik

ich werde einfach über meinen eigenen Fall iterieren, der ungefähr den gleichen Fehler ausgegeben hat - in der Resource-Deklaration (server.xml) muss KEIN driverClassName fehlen, und dass z. Für Oracle ist dies "Oracle.jdbc.OracleDriver", und die richtige JAR-Datei (z. B. ojdbc14.jar) ist in% CATALINA_HOME%/lib vorhanden

0
hello_earth

In Tomcat 8.0.44 habe ich Folgendes ausgeführt: Erstellen Sie die JNDI in der server.xml von Tomcat zwischen dem Tag "GlobalNamingResources" Beispiel:

<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>
In Ihrer Webanwendung benötigen Sie einen Link zu dieser 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>

Wenn Sie also Hiberte mit Spring verwenden, können Sie ihm sagen, dass er die JNDI in Ihrer Persistence.xml verwenden soll

 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>

In Ihrer spring.xml können Sie das tun:

<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>
Siehe oben, dass die Entität "EntityManagerFactory" auf Ihren UNIT_NAME verweist, der in der Persistenz-XML konfiguriert ist, und die Bean "postGresDataSource" hat eine Eigenschaft, die auf Ihre JNDI-Ressource in Tomcat verweist.

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

In diesem Beispiel habe ich Spring mit XML verwendet, aber Sie können dies auch programmieren, wenn Sie möchten.

Das ist es, ich hoffe geholfen.

0
Rafael Rocha