1

我想通过 JNDI 进入DataSourceSpring所有的配置都给出了。

谁能告诉我配置有什么问题。

我想在这里提到的一件事是 JNDI DS 托管在不托管Spring应用程序的 JBoss 服务器上。

配置

数据源-ds.xml

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>jdbc/wc-mysql</jndi-name>
    <connection-url>jdbc:mysql://xx.xx.xx.xx:3306/club</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>club</user-name>
    <password>club</password>
    <exception-sorter-class-name>
      org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
    </exception-sorter-class-name>
    <min-pool-size>5</min-pool-size>
    <max-pool-size>20</max-pool-size>
    <use-java-context>false</use-java-context>
    <metadata><type-mapping>mySQL</type-mapping></metadata>
  </local-tx-datasource>
</datasources>

配置上下文.xml

<bean id="wcDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/wc-mysql" />
  <property name="jndiEnvironment">
    <props>
      <prop key="java.naming.provider.url">jnp://yy.yy.yy.yy:1099</prop>
      <!-- 
      <prop key="java.naming.factory.initial">
        org.springframework.mock.jndi.SimpleNamingContextBuilder
      </prop>
      <prop key="java.naming.factory.url.pkgs">yourPackagePrefixesGoHere</prop> -->
      <!-- other key=values here -->
    </props>
  </property>
  <!-- other properties here-->
</bean>

例外

Caused by: javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
        at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
        at org.apache.naming.SelectorContext.lookup(SelectorContext.java:152)
        at javax.naming.InitialContext.lookup(InitialContext.java:392)
        at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:154)
4

2 回答 2

1

我做了一些改变,现在工作正常。

必须使用 JNP 属性初始化 JNDI 模板。并且 JBoss 服务器的 URL 必须在该属性中。

配置上下文.xml

<bean id="wcJndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop>
            <prop key="java.naming.provider.url">jnp://jndi.myURL.me:1099</prop>
            <prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jnp.interfaces</prop>
            <prop key="jnp.disableDiscovery">true</prop>
        </props>
    </property>
</bean>

<bean id="wcDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/wc-mysql"/>
    <property name="resourceRef" value="false"/>
    <property name="jndiTemplate" ref="wcJndiTemplate" />
</bean>

但是在做了这些改变之后,我面临着一个例外

java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory

所以我找到了一个链接,提到jbossall-client.jar在 POM 中包含一个依赖项来解决这个问题。所以 pom 的变化是

<dependency>
    <groupId>jboss</groupId>
    <artifactId>jbossall-client</artifactId>
    <version>4.2.2.GA</version>
</dependency>

每件事似乎都运行良好。

谢谢。

于 2012-07-17T07:42:07.333 回答
0

你的遥控器没有问题,JNDI因为这条线

 <use-java-context>false</use-java-context>

会照顾它。

您的 JNDI 名称值有问题:

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

在你的applicationConfig.xml

<property name="jndiName" value="jdbc/wc-mysql" />

<property name="jndiName" value="java:/jdbc/wc-mysql"></property>

它应该工作

于 2012-07-13T19:06:44.340 回答