Ошибка при интеграции JNDI с Spring - PullRequest
2 голосов
/ 01 июля 2011

Это была моя первая попытка Spring с JNDI, но при попытке создать ApplicationContext, например:

ApplicationContext context = new ClassPathXmlApplicationContext("master-job.xml");

файл конфигурации Spring выглядит следующим образом:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="/jdbc/Eqpstatus"/>
    <property name="resourceRef" value="true" />
</bean>

<bean id="masterDao" class="com.dao.MasterDao">
    <property name="dataSource" ref="dataSource"/>
</bean>

На сервере у меня есть требуемая запись ресурса для имени JNDI.

<Resource auth="Container" driverClassName="oracle.jdbc.OracleDriver"
        maxActive="10" maxIdle="2" maxWait="10000" name="jdbc/Eqpstatus"
        password="xxxx" type="javax.sql.DataSource"
        url="jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx) (PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx) (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xyz)))"
        username="xxx"/>

Я вижу ошибку:

javax.naming.NameNotFoundException: Name jdbc is not bound in this Context

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

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Во-первых, я думаю, что вы должны использовать выделенный тег вместо объявления bean-компонента JndiObjectFactoryBean:

<!-- JNDI DataSource for J2EE environments -->         
<jee:jndi-lookup id="dataSource" jndi-name="java:jdbc/rppsDS-PUB-PROTO" default-ref="localDataSource" />

<!-- local dataSource for JUnit integration tests -->
<bean id="localDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="maxActive" value="100"/>
    <property name="maxWait" value="1000"/>
    <property name="poolPreparedStatements" value="true"/>
    <property name="defaultAutoCommit" value="true"/>
</bean>

Затем вам нужен файл jndi.properties (который может находиться непосредственно в директории сервера приложений, например, JBoss) с содержимым, похожим на:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
1 голос
/ 01 июля 2011

Если вы используете Tomcat, и все в порядке с вашей конфигурацией Tomcat; этого должно быть достаточно:

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

Где jdbc/dataSource - это имя, определенное в вашей конфигурации Tomcat.

EDIT:

Боже мой, забыл про jndi.properties; Есть две возможности:

  • либо укажите jndi.properties на вашем пути к классам, либо
  • устанавливает значения в элементе <jee:jndi-environment/> элемента <jee:jndi-lookup /> (см. ссылка )

Свойство java.naming.factory.initial должно быть точно установлено, например, org.apache.naming.java.javaURLContextFactory, возможно, и некоторые другие значения, например:

java.naming.factory.url.pkgs=org.apache.naming  
java.naming.factory.url.pkgs.prefixes=org.apache.naming  
java.naming.provider.url=org.apache.naming  

Также см. ссылка .

...