【问题标题】:javax.naming.NameNotFoundException: Name is not bound in this Context. Unable to findjavax.naming.NameNotFoundException:名称未绑定在此上下文中。找不到
【发布时间】:2013-05-20 05:15:53
【问题描述】:

我正在尝试找出为什么我的网络应用程序会抛出一个

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

当我正在从中复制配置的姐妹服务器安静地运行时。

我有:

  1. 通过右键单击并选择“新持久性”从 netbeans 创建一个新的持久性,我不关心我给出的实际值,但我只需要在正确的目录中创建 persistence.xml 文件。李>
  2. 编辑了我的 context.xml 如下匹配工作姊妹项目中的那个
  3. 编辑了我的 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();
    }
}

我没有可能的原因。如果有人有任何建议。 谢谢

【问题讨论】:

  • 就我而言,关键部分是java:/comp/env/&lt;tomcatds&gt;/&lt;name&gt;

标签: java jakarta-ee jpa orm


【解决方案1】:

好的,发现必须配置 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" 
  />

【讨论】:

  • 我认为不建议将 元素直接放在 server.xml 文件中,如 Apache 文档中所述?
【解决方案2】:

你也可以加

<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 文件下(这将仅在应用程序级别)。

【讨论】:

    【解决方案3】:

    在 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>
    在您的 Web 应用程序中,您需要一个指向该资源的链接 (ResourceLink):

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

    所以如果你在 spring 中使用 Hiberte,你可以告诉他在你的 persistence.xml 中使用 JNDI

    <?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>
    查看上面的 entityManagerFactory bean 引用了在持久性 xml 中配置的 UNIT_NAME,并且 bean postGresDataSource 具有指向 Tomcat 中的 JNDI 资源的属性。

    &lt;property name="jndiName" value="java:comp/env/jdbc/your_jndi" /&gt;

    在这个例子中,我使用了带有 xml 的 spring,但是如果你愿意,你可以通过编程方式来完成。

    就是这样,希望有所帮助。

    【讨论】:

      【解决方案4】:

      呃,只是为了迭代我自己的案例,它给出了大致相同的错误 - 在资源声明 (server.xml) 中确保不要省略 driverClassName,例如对于 Oracle,它是“oracle.jdbc.OracleDriver”,并且正确的 JAR 文件(例如 ojdbc14.jar)存在于 %CATALINA_HOME%/lib

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-02
        • 2017-07-17
        • 2012-10-07
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        相关资源
        最近更新 更多