Конфигурация Spring Jndi, Server.xml - PullRequest
6 голосов
/ 04 марта 2011

У меня проблема с настройкой конфигурации для JNDI с помощью Spring. Я проверил другие сообщения, но не смог решить мою проблему. Я использую Tomcat 6 в качестве своего контейнера. Из моего понимания мне нужно настроить ресурс на сервере. Итак, в моем server.xml файле у меня есть это:

<GlobalNamingResources>
    <Resource auth="Container" driverClassName="org.postgresql.Driver"
            maxActive="100" maxIdle="5" maxWait="10000"
            minEvictableIdleTimeMillis="60000" name="jdbc/myTomcatPool"
            password="password" testOnBorrow="true" testWhileIdle="true"
            timeBetweenEvictionRunsMillis="10000" type="javax.sql.DataSource"
            url="jdbc:postgresql://localhost:5432/postgis" username="postgres"
            validationQuery="SELECT 1"/>
</GlobalNamingResources>

В моем spring-context.xml (который находится на пути к классам) есть следующее:

<jee:jndi-lookup id="geoCodeData" jndi-name="java:comp/env/jdbc/myTomcatPool" />

<bean id="geoCodeService" class="com.sample.SampleImpl">
    <property name="dataSource" ref="geoCodeData"/>
</bean>

У меня есть это в файле META-INF/context.xml:

<Context path="/myApp" reloadable="true" cacheMaxSize="51200"
        cacheObjectMaxSize="2560">
    <ResourceLink global="jdbc/myTomcatPool" name="jdbc/myTomcatPool"
            type="javax.sql.DataSource"/>
</Context>

Мой сервер запускается без ошибок.

Когда я пытаюсь запустить следующий тест (который работал до того, как я добавил код JNDI):

public class Test {
    public static void main(String[] args) {
        ApplicationContext ctx =
            new ClassPathXmlApplicationContext("spring-context.xml");
    }
}

Я получаю следующую ошибку:

Исключение в потоке "main" org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем 'geoCodeData': сбой вызова метода init;

вложенным исключением является javax.naming.NoInitialContextException: необходимо указать имя класса в свойстве среды или системы, либо в качестве параметра апплета, либо в файле ресурсов приложения: java.naming.factory.initial

Моя конфигурация неверна или я пытаюсь запустить тест неправильно?

Ответы [ 2 ]

11 голосов
/ 04 марта 2011

Когда вы запустите свои тестовые сценарии, вы захотите использовать JDBC вместо поиска JNDI.Простая причина в том, что вы обычно не запускаете свои тестовые примеры с сервера приложений.Таким образом, поиск JNDI завершится неудачей.

Что я делаю на своем конце, это помещаю источник данных в отдельный файл.У меня есть один файл для производства, который использует JNDI: -

project-datasource.xml

<jee:jndi-lookup id="geoCodeData" jndi-name="java:comp/env/jdbc/myTomcatPool"></jee:jndi-lookup>

... другой файл для модульного теста, который использует JDBC:-

project-datasource-test.xml

// use the same bean name "geoCodeData"
<bean id="geoCodeData" class="...">
    <property name="driverClassName" value="..." />
    <property name="url" value="..." />
    <property name="username" value="..." />
    <property name="password" value="..." />
</bean>

Веб-приложение будет использовать project-datasource.xml , тогда как модульный тест будетиспользуйте project-datasource-test.xml .

3 голосов
/ 02 сентября 2011

После нескольких часов стрижки моих (уже редких) волос мне удалось заставить мой сервер tomcat объединить подключения к базе данных с Oracle и использовать среду Spring. Хотя я и ответил бы на этот вопрос, хотя, кажется, ответ есть, на тот случай, если он кому-нибудь еще поможет.

Что я хотел: Пул соединений, администрируемый Tomcat (а не для сервлета), и конфигурация для соединения с БД в конфигурации сервера Tomcat (опять же, вместо файлов конфигурации сервлета).

У нас есть несколько экземпляров Tomcat, и каждый из них подключается к определенной БД Oracle, но разработчики создают сервлеты, которые могут потребоваться для запуска на любом из них, поэтому я не хочу, чтобы детали подключения к БД в файле WAR они производят, но позволяют им искать его и получать источник данных этого сервера через JNDI.

На сервере Tomcat conf/context.xml я добавил следующий код:


<Resource       name="jdbc/banner"
                auth="Container"
            factory="org.apache.commons.dbcp.BasicDataSourceFactory"
                    type="javax.sql.DataSource"
                    driverClassName="oracle.jdbc.OracleDriver"
                    url="jdbc:oracle:thin:@DBan8DB1.example.ac.uk:1522:bde8"
            username="dbsro"
            password="verysecret"
            initialSize="5"
            maxActive="20"
            maxIdle="10"
            removeAbandoned="true"
            global="jdbc/banner"
            maxWait="-1"/>

Очевидно, что у меня есть файлы JAR ojdbc, pool и dbcp, присутствующие в директории Tomcat lib на сервере. Здесь важно отметить, что type имеет "javax.sql.DataSource", а не "org.apache.commons.dbcp.BasicDataSource", как я изначально думал, что это должно быть.

Теперь в WEB-INF/web.xml веб-приложения я добавил следующее:


   <resource-ref>
        <description>Oracle Banner Datasource</description>
        <res-ref-name>jdbc/banner</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

и в файле servlet-context.xml моего веб-приложения (где бы вы ни находились, ваш файл может отличаться) у меня было это Это не весь файл, но здесь важно пространство имен XML для частей jee:


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:mvc="http://www.springframework.org/schema/mvc"
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/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">


<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/banner" resource-ref="true" />

Снова обратите внимание на полностью квалифицированную ссылку jndi-name="java:comp/env/jdbc/banner", которая, казалось, требовалась. Почему это не нужно в разделе resource-ref файла web.xml, я понятия не имею.

Если у кого-то есть мысли по этому поводу, я был бы рад их прочитать.

Кстати, этот URL помог: How to to источника данных Tomcat6 JNDI

После всего этого соединение заработало. Поэтому я вытирал кровь, пот и слезы со своего рабочего места и наслаждался вкусной чашкой свежего кофе.

...