从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
相关产品推荐
相关产品推荐

