【问题标题】:Configuring JNDI InitialContext from XML file从 XML 文件配置 JNDI InitialContext
【发布时间】:2013-07-06 12:24:57
【问题描述】:

我想在我的应用程序自己的 XML 配置文件中定义 JNDI 查找(有点类似于 Tomcat 的context.xml),然后在我的应用程序中引用它们。然后,在后台,应用程序使用 JNDI 来查找对象以及存储在 XML 文件中的信息。

例如,给定我应用的 XML 配置文件中的以下 sn-p:

<app>
    <!-- lots of stuff -->

    <dataSource name="jdbc/myDB"
        maxActive="50" maxIdle="30" maxWait="10000"
        username="mysqluser" password="mysqlpassword" 
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/myDB"/>

    <!-- lots of stuff -->
</app>

然后,在我的应用中:

public class DataSourceProvider {
    public DataSource lookupDataSource(String name) {
        DataSource dataSource = null;
        try {
            Context context = new InitialContext();
            dataSource = (DataSource) context.lookup("Database");
        } catch (NamingException e) {
            // Handle...
        }

        return dataSource;
    }
}

DataSourceProvider dsp = new DataSourceProvider();
DataSource myDB = dsp.lookupDataSource("myDB");

如何将这两个概念联系在一起?假设&lt;dataSource/&gt; XML 元素被读入DataSourceVO 对象。如何从DataSourceVO 实例配置InitialContext 实例,以便我们可以执行JNDI 查找?提前致谢!

更新:我找到了这个例子:

try{   
    Hashtable env = new Hashtable();   
    env.put(Context.INITIAL_CONTEXT_FACTORY,   
            "com.sun.jndi.ldap.LdapCtxFactory");   
    env.put(Context.SECURITY_AUTHENTICATION, "simple");

    String securityPrincipal = domain + "\\" + user;

    env.put(Context.SECURITY_PRINCIPAL, securityPrincipal);   
    env.put(Context.SECURITY_CREDENTIALS, password);   
    env.put(Context.PROVIDER_URL, "ldap://" + domainController);   

    ctx = new InitialDirContext(env);   
} catch (AuthenticationException ex) { 
    ex.printStackTrace();
} catch(NamingException nex){   
    nex.printStackTrace();   
}

是我要找的吗?这样,我可以将我的 XML 读入Hashtable(或类似的东西),然后从该表中创建InitialContext?这就是它的全部吗?!?

【问题讨论】:

  • 您的应用是网络应用吗?如果是,为什么不在 context.xml 中使用 JNDI?如果没有,您是否考虑过使用spring并简单地使用依赖注入?
  • 谢谢@YoriKusanagi - 不,Spring 不是一个选项,不,这是一个可重用的 JAR,而不是 WAR。
  • ...(所以没有context.xml 可用)。

标签: java configuration datasource jndi context.xml


【解决方案1】:

试试 Spring http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/jdbc.html#jdbc-connections,见 14.3.1 数据源

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

<context:property-placeholder location="jdbc.properties"/>

如果 Spring 不是一个选项,那么您可以使用 Properties 配置数据源

Properties props = new Properties();

... load from properties file or XML 

BasicDataSource ds = new BasicDataSource();
for(Entry e : props.entrySet()) {
    ds.addConnectionProperty((String)e.getKey(), (String)e.getValue());
}

【讨论】:

  • 谢谢@Evgeniy Dorofeev (+1) - 我怎样才能让 Javax 邮件会话也能正常工作?我已经确定了 JNDI 的范围,因为无论我指定 jdbc/myDB 还是 smtp/myMailServer 它都可以正常工作。例如,假设我的 JAR 恰好附带一个 context.xml 文件,其中包含邮件服务器而不是 RDBMS 服务器的资源 - 我仍然认为 JNDI 是这里的方法。
  • 嘿@Evgeniy Dorofeev - 你能看看我的更新,看看这是否是我要找的吗?再次感谢!
猜你喜欢
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
相关资源
最近更新 更多