【问题标题】:NameNotFoundException: Name is not bound in this Context. Unable to findNameNotFoundException:名称未绑定在此上下文中。找不到
【发布时间】:2019-03-18 11:27:23
【问题描述】:

我在 tomcat 中部署应用程序(war 文件)时遇到问题。

应用程序在 web.xml 和 SpringDataJPAContext.xml 中定义了对 JNDI 数据源的引用(应用程序在 jboss 上运行正常)。就我而言,我在 tomcat、server.xml 和 conf/Catalina/localhost ([name-application].xml) 内的文件中定义数据源。

在我定义的应用程序中...

在 WEB-INF/web.xml 中:

<resource-ref>
    <description>JDBC Data Source</description>
    <res-ref-name>mydb</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <mapped-name>java:mydb</mapped-name>
</resource-ref>

在WEB-INF/classes/SpringDataJPAContext.xml:

<beans: bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <beans: property name="jndiName" value="java:jdbc/mydb"/>
</beans:bean>

就我而言,我正在测试 tomcat ...

在 server.xml 中:

<GlobalNamingResources>
    ....
    <Resource name="mydb" auth="Container" type="javax.sql.DataSource"
              maxActive="100" maxIdle="30" maxWait="10000"
              username="user" password="pass" driverClassName="org.postgresql.Driver"
              url="jdbc:postgresql://localhost:5432/mydb"/>
</GlobalNamingResources>

在 conf/Catalina/localhost/myapp.xml 中:

<Context>
    <ResourceLink name="mydb" global="mydb" type="javax.sql.DataSource"/>
</Context>

但是,当我启动 tomcat 时,我得到一个找不到数据源名称的错误。我得到:

"javax.naming.NameNotFoundException: Name [jdbc/mydb] is not bound in this Context. Unable to find [jdbc]."

我尝试了不同的配置,但错误不断出现。

【问题讨论】:

    标签: java xml database tomcat datasource


    【解决方案1】:

    我会建议一些更改并让我知道它有效:

    1. 从 web.xml 中删除 &lt;mapped-name&gt;java:mydb &lt;/mapped-name&gt; 标记

    2. 只需在spring数据xml中使用&lt;beans: property name="jndiName" value="mydb"/&gt; 否则将完整的 jndi 设置为 value="java:comp/env/mydb"

    您粘贴的异常对我来说看起来很奇怪。 “[jdbc/mydb]”tomcat 正在搜索树分支 jdbc,然后在其中搜索 mydb,这可能是由于映射名称和 spring 数据 xml “jboss”前缀。 理想情况下,它应该直接在 jndi 树中搜索“mydb”。

    请告诉我结果。

    【讨论】:

      【解决方案2】:

      我在帖子中犯了一个小错误。 jndi 的值为:value="java:jdbc/mydb"(我已经编辑过了)。

      我在 SpringDataJPAContext.xml 中进行了更改(我添加了“comp/env”并删除了前缀“jdbc”)......我不再遇到同样的错误。现在我有另一个错误:

      ERROR o.s.web.context.ContextLoader - Context initialization failed
      org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [SpringDataJPAContext.xml]: Invocation of init method failed; nested exception is java.lang.AbstractMethodError: org.postgresql.jdbc3.Jdbc3Connection.isValid(I)Z
      

      【讨论】:

        【解决方案3】:

        SpringDataJPAContext.xml:

        <?xml version="1.0" encoding="UTF-8"?>
        <beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xmlns:tx="http://www.springframework.org/schema/tx"
                     xmlns="http://www.springframework.org/schema/data/jpa"
                     xsi:schemaLocation="http://www.springframework.org/schema/beans
                                        http://www.springframework.org/schema/beans/spring-beans.xsd
                                        http://www.springframework.org/schema/data/jpa
                                        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
                                        http://www.springframework.org/schema/tx
                                        http://www.springframework.org/schema/tx/spring-tx.xsd">
        
            <repositories base-package="cl.cgr.sistradoc.repository" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"/>
        
            <beans:bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
                <beans:property name="jndiName" value="java:comp/env/sistradocgi" />
            </beans:bean>
            <beans:bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
                <beans:property name="dataSource" ref="dataSource" />
                <beans:property name="persistenceUnitName" value="cgrPU" /> <!-- agregando configuraciones custom repository Lorenzo  -->
                <beans:property name="packagesToScan" value="cl.cgr.sistradoc.entity" />
                <beans:property name="jpaVendorAdapter">
                    <beans:bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
                </beans:property>
            </beans:bean>
        
            <beans:bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
                <beans:property name="entityManagerFactory" ref="entityManagerFactory" />
            </beans:bean>
            <tx:annotation-driven />
        </beans:beans>
        

        【讨论】:

          【解决方案4】:

          我找到了最后一个错误的解决方法:是postgresql驱动的版本。

          【讨论】:

            猜你喜欢
            • 2012-03-10
            • 2013-05-20
            • 2015-12-24
            • 2019-06-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多