【发布时间】:2013-11-14 13:04:47
【问题描述】:
我是 EJB 新手,我正在尝试让一个简单的无状态会话 Bean 工作。
我正在为此使用 glassfish。
我做了什么:
我已经创建了一个包含接口的 jar 文件:
@Local
public interface SimpleStatelessBeanLocal {
public String getHello();
}
然后,我为我的 EJB 创建了一个 war 文件,其中包含以下类(依赖于带有接口的 jar):
@Stateless
public class SimpleStatelessSessionBean implements SimpleStatelessBeanLocal {
public String getHello() {
return "Hello from stateless session bean";
}
}
然后,我创建了一个 Web 应用程序,其中包含一个 servlet 和一个对带有接口的 jar 的依赖项。
@WebServlet("/SimpleServlet")
public class SimpleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
InitialContext ctx;
try {
ctx = new InitialContext();
Object object = ctx.lookup("java:global/simple-stateless-session-bean/SimpleStatelessSessionBean");
response.getWriter().println(object);
Class c = object.getClass();
for (Class i : c.getInterfaces()) {
response.getWriter().println(i.getName());
}
response.getWriter().println(object instanceof SimpleStatelessBeanLocal);
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这有以下输出:
be.sdutry.ejb.tests.stateless.simple.SimpleStatelessBeanLocal_253329002
com.sun.enterprise.container.common.spi.util.IndirectlySerializable
be.sdutry.ejb.tests.stateless.simple.SimpleStatelessBeanLocal
false
所以基本上它找到了 Bean,它实现了那个接口,但它不是来自当前类加载器的那个接口的实例,这意味着我不能转换它。
我在这里做错了什么吗? 我很确定除了反射之外必须有其他方法解决这个问题?
我已经尝试过的: 我发现一个帖子建议将 jar 与提供的接口放在一起,但后来我得到了 ClassNotFoundException。
使用:
- 玻璃鱼4
- EJB 3.1
【问题讨论】:
-
没有直接关系,但我想知道您为什么使用上下文查找而不是@EJB 注入?此外,EJB3.1 旨在简单(只要您遵循规则手册 :),您在此处尝试的操作即使没有接口也应该可以工作,如 EJB 3.1 Lite),我可以建议最优秀的Oracle JavaEE tutorial帮助您入门?和
-
@fvu 按照您发布的文档链接,我能够制作一个成功运行的 SLSB 示例。这个例子的缺点是 SLSB 和实际代码在同一个 war 文件中。我实际上需要的是 ejb 处于单独的战争中,因为最终我们将有多个项目使用相同的 EJB。我的下一步是看看如果我在 2 场不同的战争中将它们分开,它是否仍然有效。
-
请参阅教程 wrt 打包的第 5.2 章,对于您的应用程序,我会将 EJB 打包并部署为 EJB-jar、EJB3 样式 - 可选地与 EAR 中的 WAR 一起打包。现在,本教程的 v7 似乎主要关注新的无接口模型,您会注意到 version 5 of the same tutorial 显示了一个完整的示例 EJB,它公开了显式的本地和远程接口,从该示例开始可能更容易。
标签: jndi ejb-3.1 classcastexception glassfish-4