Java 尝试使用简单JNDI时出错

Java 尝试使用简单JNDI时出错,java,unit-testing,jndi,hsqldb,in-memory-database,Java,Unit Testing,Jndi,Hsqldb,In Memory Database,出于单元测试的目的,我正在尝试设置JNDI,以便在不使用Tomcat的情况下连接到HSQLDB。为了做到这一点,我使用并遵循这一点 因此,首先我创建了一个类来初始化JNDI数据源: import org.hsqldb.jdbc.JDBCDataSource; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class

出于单元测试的目的,我正在尝试设置JNDI,以便在不使用Tomcat的情况下连接到HSQLDB。为了做到这一点,我使用并遵循这一点

因此,首先我创建了一个类来初始化JNDI数据源:

import org.hsqldb.jdbc.JDBCDataSource;    
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class JndiDataSource {
    public void Initialize() throws NamingException {
        // Create initial context
        System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.osjava.sj.MemoryContextFactory");
        System.setProperty("org.osjava.sj.jndi.shared", "true");
        InitialContext ic = new InitialContext();

        ic.createSubcontext("java:/comp/env/jdbc");

        // Construct DataSource
        JDBCDataSource ds = new JDBCDataSource();
        ds.setDatabase("jdbc:hsqldb:hsql://localhost/xdb");
        ds.setUser("SA");
        ds.setPassword("");

        // Put datasource in JNDI context
        ic.bind("java:/comp/env/jdbc/myDS", ds);
    }
}
然后在单元测试中,我调用
Initialize()
,只是试图查找数据源

import org.junit.jupiter.api.Test;    
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class JndiDataSourceTest {
    @Test
    public void testInitialize() throws NamingException {
        JndiDataSource jds = new JndiDataSource();
        jds.Initialize();

        InitialContext ic = new InitialContext();
        DataSource ds = (DataSource)ic.lookup("java:/comp/env/jdbc/myDS");
    }
}
不幸的是,当我尝试调试这个单元测试时,它在查找时失败,
(DataSource)ic.lookup(“java:/comp/env/jdbc/myDS”)调试器说

javax.naming.NameNotFoundException:java:/comp/env/jdbc/myDS


所以问题是,我做错了什么?

可能是一个简单的输入错误-它应该是org.osjava.sj.memory.MemoryContextFactory

简单JNDI到0.18.1的问题是org.osjava.sj.MemoryContextFactory没有考虑系统属性。因此,每一次呼吁

new InitialContext()
一个新的MemoryContext被初始化,它与以前初始化的MemoryContext不共享任何内容

我用0.18.2改变了这种行为。在此之前,有两种解决方案

首先

将jndi.properties与以下内容放在类路径中:

java.naming.factory.initial = org.osjava.sj.MemoryContextFactory
org.osjava.sj.jndi.shared = true
因此,您可以省去系统属性

更容易出错的方法。使用采用环境配置的构造函数:

InitialContext(Hashtable<?, ?> environment)
我还建议设置

jndi.syntax.direction = left_to_right
jndi.syntax.separator = /

SimpleJNDI>0.11.4.1有许多优点。请参阅。

很少涉及任何JNDI,但如果您还记得,仍有一些配置需要在应用程序服务器上进行管理,以允许数据源名称有效/引入。@Plain_Dude_Sleeping_only:Simple JNDI不需要应用程序服务器。这就是我发布的链接中的内容,但对我来说,简单的jndi jar中缺少内存目录。看起来我有错误的maven依赖项。正在使用此
https://mvnrepository.com/artifact/com.github.h-thurow/simple-jndi/0.17.0
。已更改为此
https://mvnrepository.com/artifact/simple-jndi/simple-jndi/0.11.4.1
而且它似乎正在工作
jndi.syntax.direction = left_to_right
jndi.syntax.separator = /