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

如何在Open Liberty中调用WAS 8.5上的远程EJB 3.1

Open Liberty调用WAS 8.5 EJB 3.1问题排查与解决

基础支持与配置要求

Open Liberty完全支持调用WAS 8.5上部署的EJB 3.1,两者遵循同一规范,兼容性良好。

必须启用的server.xml特性

当前配置的webProfile-7.0不足以支持远程EJB调用,需添加以下特性:

<featureManager>
    <feature>webProfile-7.0</feature>
    <feature>ejbClient-3.2</feature> <!-- EJB客户端核心功能 -->
    <feature>iiop-1.3</feature>     <!-- 支持IIOP协议(WAS远程EJB默认协议) -->
</featureManager>

问题1:javax.naming.NameNotFoundException

错误根源

WAS 8.5使用传统JNDI命名空间,而非EJB 3.1的ejb/global全局规范,你用的Open Liberty风格命名在WAS 8.5中不存在。

修复方案

改用WAS 8.5对应的JNDI命名格式,并正确配置InitialContext的环境参数:

  1. 指定WAS上下文工厂与提供者URL:必须明确指定WAS的命名工厂和IIOP端口(WAS 8.5默认BOOTSTRAP端口为2809,需确认实际端口)
  2. 使用WAS原生JNDI名称:格式为ejb:<EAR名称>/<EJB模块名称>/<Bean类名>!<远程接口全限定名>

修改后的Servlet代码:

@WebServlet("/RemoteTxAttrServlet")
public class TestServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Properties env = new Properties();
        // WAS专属上下文工厂
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
        // WAS的IIOP端口(替换为实际地址和端口)
        env.put(Context.PROVIDER_URL, "iiop://10.64.2.93:2809");

        Object found = null;
        try {
            Context c = new InitialContext(env);
            // 替换为WAS 8.5上EJB的实际JNDI名称
            String jndiName = "ejb:your-ear-name/your-ejb-module/YourBean!com.yourpackage.YourRemoteInterface";
            found = c.lookup(jndiName);

            // 窄化EJB引用(解决第二个问题)
            YourRemoteInterface ejb = (YourRemoteInterface) javax.rmi.PortableRemoteObject.narrow(found, YourRemoteInterface.class);
            // 调用EJB方法
            ejb.yourBusinessMethod();

        } catch (NamingException | RemoteException e) {
            e.printStackTrace();
        }

        System.out.println(found);
    }
}

问题2:找不到javax.rmi.PortableRemoteObject

错误原因

javax.rmi.PortableRemoteObject属于CORBA相关API,webProfile-7.0不包含该类,需补充依赖或启用对应特性。

修复方案

  1. 依赖补充:如果用Maven,添加以下依赖到pom.xml:
<dependency>
    <groupId>javax.rmi</groupId>
    <artifactId>javax.rmi-api</artifactId>
    <version>1.0.1</version>
    <scope>provided</scope>
</dependency>
  1. 特性保障:确保已经启用ejbClient-3.2特性,该特性会自动将CORBA相关类加入类路径。

额外注意事项

  • 端口确认:WAS 8.5的BOOTSTRAP端口默认是2809,而非你代码中的2821,可在WAS控制台「服务器→服务器类型→WebSphere应用服务器→你的服务器→端口」中查看实际值。
  • 安全配置:如果WAS启用了安全验证,需在InitialContext中添加凭证:
    env.put(Context.SECURITY_PRINCIPAL, "was用户名");
    env.put(Context.SECURITY_CREDENTIALS, "was密码");
    
  • 接口依赖:确保EJB的远程接口已经打包到你的Web应用中,或作为依赖引入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:40:33