You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从WAS迁移到Liberty时JNDI上下文初始化错误,WsnInitialContextFactory类找不到如何解决

解决方案

报错根因为:Open Liberty/WebSphere Liberty本身不兼容传统WebSphere(WAS)特有的com.ibm.websphere.naming.WsnInitialContextFactory上下文工厂类,你当前的配置和代码都硬编码了WAS专属的初始化参数,迁移后必然触发类不存在错误,按照以下两步操作即可解决:

1. 修改jndi.properties配置

直接删除配置文件中以下两行配置即可:

INITIAL_CONTEXT_FACTORY = "com.ibm.websphere.naming.WsnInitialContextFactory" 
CC_PROVIDER_URL = "iiop://localhost.svr.us.xxxxxxx.net:41516"

Liberty内置了默认的JNDI上下文工厂,不需要手动指定该配置项,服务器会自动加载默认实现。

2. 调整应用JNDI查找代码

你当前代码手动传入了WAS专属的上下文工厂、服务地址参数,这部分逻辑直接移除即可,标准Java EE环境下初始化InitialContext不需要传入自定义参数,服务器会自动注入上下文配置。
调整后的代码参考:

try {
    // 直接使用无参构造初始化上下文,无需传入WAS专属配置参数
    Context ctx = new InitialContext();
    try {
        ds = (DataSource) ctx.lookup("java:comp/env/" + jndiName);
    } catch (Exception ex) {
        LogUtil.debugException("DBConnectionManager", "Exception in init: Resource reference DataSource lookup Error.", "init()", ex, "");
        try {
            ds = (DataSource) ctx.lookup("jdbc/" + jndiName);
        } catch (Exception exp) {
            LogUtil.debugException("DBConnectionManager", "Exception in init: Datasource lookup Error.", "init()", exp, "");
        }
    }

前置校验

操作完成后确认Liberty的server.xml中已经开启了jdbc-4.0及以上版本的功能,且配置的数据源JNDI名称和代码中查找的jdbc/[jndiName]完全匹配,示例配置参考:

<featureManager>
    <feature>jdbc-4.3</feature>
    <!-- 其他需要的功能 -->
</featureManager>

<dataSource jndiName="jdbc/你的数据源名称">
    <!-- 数据库连接池、驱动、地址账号等配置 -->
</dataSource>

内容的提问来源于stack exchange,提问作者Deminem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 19:57:03