web-dev-qa-db-ja.com

javax.naming.NameNotFoundException:名前[jdbc / spitterDS]はこのコンテキストにバインドされていません。 [jdbc]が見つかりません

Springのjee jndi-lookupタグを使用してTomcatのJNDIdatasourceにアクセスしようとしています。

例外は、datasourceを正しく登録していないことを示していますが、その理由を理解できません。

これが私のコードです:-

service-context.xml:-

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                    http://www.springframework.org/schema/context
                    http://www.springframework.org/schema/context/spring-context-3.0.xsd
                    http://www.springframework.org/schema/mvc
                    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
                    http://www.springframework.org/schema/jee 
                    http://www.springframework.org/schema/jee/spring-jee.xsd">

    <context:component-scan base-package="spitter" />
    <mvc:annotation-driven />

    <jee:jndi-lookup id="dataSource" jndi-name="/jdbc/spitterDS" resource-ref="true" />

</beans>

webapp/META-INF/context.xml:-

<Context path="/spitter" reloadable="true" cachingAllowed="false" antiResourceLocking="true">

<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>

<Resource name="jdbc/spitterDS" auth="Container" type="org.Apache.commons.dbcp.BasicDataSource"
    maxActive="100" maxIdle="30" maxWait="10000" username="root" password="password"
    driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/spitter" />
</Context>

web.xml:-

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://Java.Sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">

<display-name>Spitter</display-name>

<resource-ref>
    <description>Spitter DS</description>
    <res-ref-name>jdbc/spitterDS</res-ref-name>
    <res-type>org.Apache.commons.dbcp.BasicDataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:service-context.xml
    </param-value>
</context-param>

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

</web-app>

そして最後に、

MainController.Java:-

package spitter.mvc;

import Java.sql.Connection;
import Java.sql.SQLException;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;


@Controller
@RequestMapping("/")
public class MainController {
    @Resource(name="dataSource")
    private DataSource dataSource;

    @RequestMapping(method = RequestMethod.GET)
    public String showHome(Model model) throws SQLException{
        Connection con = dataSource.getConnection();

        return "spitter";
    }
}

JEE開発者向けにTomcat 7Eclipse keplerを使用しています。 EclipseでTomcatサーバーを起動したときの例外:-

org.springframework.beans.factory.BeanCreationException:「mainController」という名前のBeanの作成中にエラーが発生しました:リソースの依存関係の挿入に失敗しました。ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです:「dataSource」という名前のBeanの作成中にエラーが発生しました:initメソッドの呼び出しに失敗しました。ネストされた例外はjavax.naming.NameNotFoundExceptionです:名前[jdbc/spitterDS]はこのコンテキストにバインドされていません。 [jdbc]が見つかりません。

どこかでタイプミスをしたと思いますが、見つかりません。助けてください!

4
user3337218

_"/jdbc/spitterDS"_は_"jdbc/spitterDS"_と等しくありません。

_service-context.xml_ファイルでは、
変化する

_<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/spitterDS" resource-ref="true" />
_

_<jee:jndi-lookup id="dataSource" jndi-name="jdbc/spitterDS" resource-ref="true" />
_

編集

「dataSource」という名前のBeanの作成中にエラーが発生しました:

ドキュメントに従って:

... @Resource(name="jdbc/Foo") DataSource ds;アノテーションでは、グローバルJNDI名は_jdbc/Foo_です。
.。
アプリケーションコードの@Resourceアノテーションは次のようになります。
@Resource(name="jdbc/helloDbDs") javax.sql.DataSource ds;

変化する:

_@Resource(name="dataSource")
private DataSource dataSource;
_

に:

_@Resource(name="jdbc/spitterDS")
private DataSource dataSource;
_

参照先Javaネーミングおよびディレクトリインターフェイス を使用します。

3
Ravinder Reddy

私もこの問題に直面しました。私の場合、Tomcatログからの警告を見逃しました。次のjarファイルを含めませんでした。

org.Apache.commons.dbcp.BasicDataSourceFactory 

commons-dbcp-x.x.jar
commons-pool-x.x.x.jar
commons-lang-x.x.x.jar

これを修正しました。すべて正常に実行されます。

2
Vielinko

私の場合、my.cnf max_connections = 120の設定を増やす必要がありました。mysqlの設定を誤ると、このエラーメッセージが表示されるという印象を受けます。

1
Tim Pizey

同じ正確なエラーが発生しました。しかし、私にとっては、以下がリソースから欠落していました

driverClassName="Oracle.jdbc.OracleDriver"

それを追加した後、すべてが完全に機能しました。

0
Aniket Thakur