web-dev-qa-db-ja.com

javax.naming.NameNotFoundException:名前はこのコンテキストにバインドされていません。見つけることができない

私のWebアプリケーションがなぜスローするのかを見つけようとしています

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

構成のコピー元の姉妹が静かに実行されるとき。

私が持っています:

  1. 右クリックして「new persistence」を選択することにより、netbeansから新しい永続性を作成します。実際の値を指定する必要はありませんが、適切なディレクトリにpersistence.xmlファイルを作成する必要があります。
  2. 私のcontext.xmlを以下のように編集して、作業中の姉妹プロジェクトのものと一致させました
  3. 以下に示すように、リソースDataSourceを含むようにweb.xmlを編集しました
  4. 私のpersistence.xmlを以下のように編集して、姉妹プロジェクトで動作するのと同じ値を再度一致させました。
  5. 他のプロジェクトに存在するすべてのライブラリを私のlibフォルダー内に追加し、NetBeansからも追加して、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>

現在、私のシステムプロジェクトは、起動時にApache-Tomcat-7.0.40/bin/exampleDB内にデータベースフォルダーを何らかの方法で作成しますが、私のプロジェクトでは作成せず、上記のエラーをスローします。

エラーがスローされるコードは、データベースに初めて接続したときです。

EntityManager entityManager = PersistenceProvider.createEntityManager();

persistenceProviderクラスは次のとおりです。

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

この理由は考えられません。誰か提案があれば。ありがとうございました

18
dendini

データソースを機能させるにはTomcatファイルserver.xmlも設定する必要があることがわかりました。追加するだけです:

<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

追加することもできます

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

META-INF/context.xmlファイル(これはアプリケーションレベルでのみ行われます)。

5
Ritesh Kaushik

Tomcat 8.0.44でこれを行いました。タグ「GlobalNamingResources」の間にTomcatのserver.xmlでJNDIを作成します。次に例を示します。

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

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>

したがって、春にHiberteを使用している場合、persistence.xmlでJNDIを使用するように彼に伝えることができます。

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>

したがって、spring.xmlで次のことができます。

<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>
<property name="jndiName" value="Java:comp/env/jdbc/your_jndi" />

この例では、xmlでspringを使用しましたが、必要に応じてプログラムで実行できます。

それだけです、お役に立てば幸いです。

2
Rafael Rocha

ほぼ同じエラーを出した自分のケースを反復するだけです-リソース宣言(server.xml)では、driverClassNameを省略しないようにしてください。 Oracleの場合は「Oracle.jdbc.OracleDriver」であり、正しいJARファイル(ojdbc14.jarなど)が%CATALINA_HOME%/ libに存在すること

0
hello_earth