将 Spring 数据源绑定到 JNDI

Posted

技术标签:

【中文标题】将 Spring 数据源绑定到 JNDI【英文标题】:Bind Spring datasource to JNDI 【发布时间】:2020-07-19 04:05:57 【问题描述】:

我有一个基于 Spring Boot 的 Spring 应用程序,该应用程序部署到 外部 tomcat 实例中。

应用程序创建的数据源很少。这些数据源被添加到 entitymanager 并相应地设置事务管理器。

不过,最近我们以编程方式集成了一个与 JNDI 数据源一起使用的 ETL 工具。这里的要求是在启动时将当前的spring数据源绑定到JNDI树中。

我尝试在创建数据源 bean 后创建初始上下文并将数据源绑定到那里,但是,我确实看到抛出了 NoInitialContext 异常。

如何将这些 spring 数据源绑定到外部 tomcat 的 JNDI 树中?感谢您的帮助!

注意:我不能/不允许编辑 tomcat 配置,因为它是从 PaaS 模板初始化的。因此需要研究能够从应用程序内部绑定到 JNDI 树的方法。

【问题讨论】:

【参考方案1】:

AFAIK 这是不可能的。看看 JEE 规范:

容器必须确保应用程序组件实例对其命名上下文只有读取权限。容器必须从修改环境命名上下文及其子上下文的 javax.naming.Context 接口的所有方法中抛出 javax.naming.OperationNotSupportedException。 Jakarta EE Spec - Resources, Naming, and Injection

如果你想玩玩,请参阅this SO post 有一些有趣的代码示例。

恕我直言,您可以通过创建 JNDI 资源并将它们传递给 EntityManger/Spring 来实现您想要的。但这意味着配置将完全存在于 Spring 之外。所以这可能不会做你想做的事。

【讨论】:

以上是关于将 Spring 数据源绑定到 JNDI的主要内容,如果未能解决你的问题,请参考以下文章

在tomcat中绑定JNDI数据源?

Spring+Tomcat的JNDI数据源连接池简单配置

Tomcat 8,axis2 webservices aar,spring jndi未绑定在上下文中

将 jndi 数据源与 spring 批处理管理一起使用

休眠错误配置:未将工厂绑定到 JNDI,未配置 JNDI 名称

以编程方式将数据源添加到嵌入式 tomcat 7 中的 JNDI 上下文