如何在有状态会话 bean 上下文查找期间定义名称?
How to define the name during stateful session bean context lookup?
我正在设置一个有状态会话 bean 并想用 context.lookup(name) 调用它,但不知道如何正确定义 name 变量。
我正在使用 Intellij,据我所知,与 NetBeans 相比,没有办法自动生成此路径。我已经使用我为这个名字找到的指南尝试了多种方法:
java:scope[/app-name]/module-name/bean-name[!fully-qualified-interface-name]
但是,我总是收到以下错误
javax.naming.NamingException:在 SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory、java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl、java.naming.factory.url.pkgs= 中查找 'RememberEJB' 失败com.sun.enterprise.naming} [根异常是 javax.naming.NameNotFoundException: RememberEJB not found]
调用函数的方法如下:
public Response getRememberedPost() {
try {
javax.naming.Context context = new InitialContext(); // Could also be InitialContext context = new InitialContext();
RememberBean rememberBean = (RememberBean) context.lookup("RememberEJB");
return Response.ok(rememberBean).build();
}
catch (NamingException e) {
e.printStackTrace();
return Response.noContent().build();
}
}
我希望名称变量必须类似于 "java:global/project-name/folder-for-beans/RememberEJB!src.Beans.RememberLocal" 但这仍然会产生相同的错误。
您可以参考以下来自Java EE tutorial的内容:
使用 No-Interface 视图访问本地企业 Bean
客户端对公开本地 no-interface 视图的企业 bean 的访问是通过依赖注入或 JNDI 查找来完成的。
获取对企业 bean 的 no-interface 视图的引用
通过依赖注入,使用 javax.ejb.EJB
注释和
指定企业 bean 的实现 class:
@EJB
ExampleBean exampleBean;
获取对企业 bean 的 no-interface 视图的引用
通过 JNDI 查找,使用 javax.naming.InitialContext 接口的
查找方法:
ExampleBean exampleBean = (ExampleBean)InitialContext.lookup("java:module/ExampleBean");
所以在你的情况下:
RememberBean rememberBean = (RememberBean)context.lookup("java:module/RememberEJB");
我尝试了 Ahmed Raaj 给出的答案,但仍然无法正常工作。我最终通过在启动时查看服务器日志找到了正确的名称,它显示了我的有状态 bean 的 JNDI 名称。在我的例子中,这是下面显示的名称。
RememberBean rememberBean = (RememberBean) context.lookup("java:global/DistributedGlassfish_ear_exploded/ejb/RememberEJB!Beans.RememberBean");
这与我之前尝试的非常接近,我只是没想到还要包括'_ear_exploded'。
我正在设置一个有状态会话 bean 并想用 context.lookup(name) 调用它,但不知道如何正确定义 name 变量。
我正在使用 Intellij,据我所知,与 NetBeans 相比,没有办法自动生成此路径。我已经使用我为这个名字找到的指南尝试了多种方法: java:scope[/app-name]/module-name/bean-name[!fully-qualified-interface-name] 但是,我总是收到以下错误 javax.naming.NamingException:在 SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory、java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl、java.naming.factory.url.pkgs= 中查找 'RememberEJB' 失败com.sun.enterprise.naming} [根异常是 javax.naming.NameNotFoundException: RememberEJB not found]
调用函数的方法如下:
public Response getRememberedPost() {
try {
javax.naming.Context context = new InitialContext(); // Could also be InitialContext context = new InitialContext();
RememberBean rememberBean = (RememberBean) context.lookup("RememberEJB");
return Response.ok(rememberBean).build();
}
catch (NamingException e) {
e.printStackTrace();
return Response.noContent().build();
}
}
我希望名称变量必须类似于 "java:global/project-name/folder-for-beans/RememberEJB!src.Beans.RememberLocal" 但这仍然会产生相同的错误。
您可以参考以下来自Java EE tutorial的内容:
使用 No-Interface 视图访问本地企业 Bean
客户端对公开本地 no-interface 视图的企业 bean 的访问是通过依赖注入或 JNDI 查找来完成的。
获取对企业 bean 的 no-interface 视图的引用 通过依赖注入,使用
javax.ejb.EJB
注释和 指定企业 bean 的实现 class:@EJB ExampleBean exampleBean;
获取对企业 bean 的 no-interface 视图的引用 通过 JNDI 查找,使用 javax.naming.InitialContext 接口的 查找方法:
ExampleBean exampleBean = (ExampleBean)InitialContext.lookup("java:module/ExampleBean");
所以在你的情况下:
RememberBean rememberBean = (RememberBean)context.lookup("java:module/RememberEJB");
我尝试了 Ahmed Raaj 给出的答案,但仍然无法正常工作。我最终通过在启动时查看服务器日志找到了正确的名称,它显示了我的有状态 bean 的 JNDI 名称。在我的例子中,这是下面显示的名称。
RememberBean rememberBean = (RememberBean) context.lookup("java:global/DistributedGlassfish_ear_exploded/ejb/RememberEJB!Beans.RememberBean");
这与我之前尝试的非常接近,我只是没想到还要包括'_ear_exploded'。