Simple-JNDI VS SimpleNamingContextBuilder 与 EmbeddedDatabaseBuilder 和已有的数据源

问题描述 投票:0回答:2

有谁知道如何使用 Simple-JNDI 配置 EmbeddedDatabaseBuilder 数据源? 我有一个用于测试目的的数据源,我正在这样构建:

    public DataSource dataSource() {
    EmbeddedDatabase datasource = new EmbeddedDatabaseBuilder()
            .setType(HSQL)
            .setSeparator(";")
            .addScript("classpath:/tables-definitions.sql")
            .build();
    return datasource;
}

我想使用 Simple-JNDI 将其绑定到 JNDI 名称。你知道该怎么做吗?

java spring spring-boot hibernate spring-test
2个回答
2
投票

最后我找到了如何使用 Simple-JNDI 绑定到您已有的数据源的 jndi 名称的答案,通常用于测试目的。

如果您尝试使用 SimpleNamingContextBuilder,这只是一个观察:

  • SimpleNamingContextBuilder 在 spring 5.2 及更高版本中已弃用,转而使用 Simple-JNDI
  • 不幸的是,我没有找到 Simple-JNDI 的良好文档来源,这使得更高级的东西变得有点麻烦。
  • 此外,SimpleNamingContextBuilder 不能与 JTA 一起使用,只能与 JPA 一起使用 - 它不能涵盖 JTA 的所有命名需求

现在,如何将带有 Simple-JNDI 的 JNDI 名称绑定到数据源:

  • 您需要将 Context.INITIAL_CONTEXT_FACTORY 设置为您想要为您完成这项工作的工厂类,在我的例子中,我选择 org.osjava.sj.memory.MemoryContextFactory - 如果您在 Simple 中查看此类的位置 - JNDI 库,您会根据您的需要在那里找到更多选项

    System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.osjava.sj.memory.MemoryContextFactory");
    

然后创建一个哈希表并添加您需要设置的所有属性,就像通过属性设置它们一样。

    Hashtable env = new Hashtable();
    env.put("org.osjava.sj.jndi.shared", "true");

然后将 DS 绑定到 JNDI 名称,就像使用旧的简单方式一样:

  • 使用哈希表中的属性创建初始上下文

  • 创建子上下文

  • 然后将数据源绑定到JNDI名称/上下文:

    InitialContext ic = new InitialContext(env);
    ic.createSubcontext("java:/comp/env/jdbc");
    ic.bind("java:/comp/env/jdbc/"+dataSourceJndiname, datasource);
    

0
投票

这也对我有帮助。 我从 Spring 5 过渡到 Spring 6,无法再使用 springframework-mock.jar,因为它包含已移至 springframework-test.jar 中的类。 特别是 SimpleNamingContextBuilder。 这对我有用。

        Hashtable<String, String> env = new Hashtable<>();
    try {
        Properties properties = new Properties();
        properties.load(ResourceHelper.getFileResourceStream("/jndi.properties"));
        Set<Map.Entry<Object, Object>> entries = properties.entrySet();
        for (Map.Entry<Object, Object> entry : entries) {
            env.put(entry.getKey().toString(), entry.getValue().toString());
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    InitialContext initialContext = new InitialContext(env);
    Context subcontext = initialContext.createSubcontext("java:comp");
    Context envSubcontext = subcontext.createSubcontext("env");

    initialContext.bind("java:comp/env/sqlDataStoreDS", testSqlDataSource);
© www.soinside.com 2019 - 2024. All rights reserved.