如何在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的环境参数:
- 指定WAS上下文工厂与提供者URL:必须明确指定WAS的命名工厂和IIOP端口(WAS 8.5默认BOOTSTRAP端口为2809,需确认实际端口)
- 使用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不包含该类,需补充依赖或启用对应特性。
修复方案
- 依赖补充:如果用Maven,添加以下依赖到
pom.xml:
<dependency> <groupId>javax.rmi</groupId> <artifactId>javax.rmi-api</artifactId> <version>1.0.1</version> <scope>provided</scope> </dependency>
- 特性保障:确保已经启用
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
相关产品推荐
相关产品推荐

