Как получить источник данных, объявленный весной в файле конфигурации XML - PullRequest
0 голосов
/ 04 февраля 2011

У меня есть источник данных Spring, который выглядит следующим образом:

<bean id="dataSource1" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${database.driver}" />
    <property name="url" value="${database1.url}" />
    <property name="username" value="${database1.username}" />
    <property name="password" value="${database1.password}" />
</bean>

Мне нужно сделать это доступным на jndi или jee.некоторые связанные вещи:

<bean id="dataSourceJNDI1" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/dataSource1"/>
    <property name="beanClassLoader" ref="dataSource1"></property>
</bean>

или, может быть:

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

не знаю, как заставить jndi или jee работать с dbcp.любая помощь будет оценена.

спасибо заранее.

пс: ребята, это особая игла.поэтому я должен сделать это так.пожалуйста, не публикуйте ненужные советы о том, почему я должен использовать tomcat server в качестве источника данных.я знаю о настройке источника данных таким образом.повторяю еще раз, это особая необходимость.Также, пожалуйста, не предоставляйте мне решения Java-кода, не требуется.

ps: те, кто не знает, как это сделать, не занимайте место в этом посте, говоря, что это невозможно.Если вы не знаете ответ, нет необходимости публиковать и складывать сообщения.

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Вам необходимо привязать источник данных к дереву JNDI. Вам нужно будет указать параметры для подключения к локальному дереву JNDI. JndiTemplate может сделать это. Некоторые свойства среды JNDI, вероятно, не понадобятся для локального InitialContext. Я думаю, что "java.naming.factory.initial" является единственным обязательным. Другой предназначен для подключения к серверу JNDI вне процесса:

    <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.provider.url">${jndi.provider.url}</prop>
            <prop key="java.naming.factory.initial">${jndi.factory.initial}</prop>
            <prop key="java.naming.security.principal">${jndi.security.principal}</prop>
            <prop key="java.naming.security.credentials">${jndi.security.credentials}</prop>
        </props>
    </property>
</bean>

<bean factory-bean="jndiTemplate" factory-method="bind">
    <constructor-arg type="java.lang.String" value="java:com/env/DataSoure"/>
    <constructor-arg type="java.lang.Object" ref="dataSource"/>
</bean>

Если вы выполняете поиск JNDI в том же контексте Spring, вам нужно либо, чтобы компонент JNDI зависел от этого компонента поиска, либо сделать поиск JNDI ленивым, чтобы он выполнял поиск при первом использовании.

0 голосов
/ 04 февраля 2011

Поскольку вы используете jndi, вы должны объявить источник данных как источник jndi.

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

<bean id="dataSource1" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="dataSource" ref="dataSource" />
    <property name="driverClassName" value="${database.driver}" />
    <property name="url" value="${database1.url}" />
    <property name="username" value="${database1.username}" />
    <property name="password" value="${database1.password}" />
</bean>

Это должно работать, если ваше определение bean-компонента для dataSource1 правильное.

...