我是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";
}
}
然后我创建了一个带有单个servlet的Web应用程序,以及带有接口的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。
使用:
答案 0 :(得分:0)
我设法让它运转起来。 主要问题是SLSB需要是远程的,因为使用它的代码不在同一个EAR文件中。
我这样做的方式:
Jar仅包含接口:
public interface SimpleStatelessBeanCommon {
public String getHello();
}
@Local
public interface SimpleStatelessBeanLocal extends SimpleStatelessBeanCommon{
}
@Remote
public interface SimpleStatelessBeanRemote extends SimpleStatelessBeanCommon{
}
War包含Bean实现(依赖于带接口的jar)
@Stateless
public class SimpleStatelessSessionBean implements SimpleStatelessBeanLocal, SimpleStatelessBeanRemote {
public String getHello() {
return "Hello from stateless session bean";
}
}
使用Bean进行战争(依赖于带接口的jar)
@WebServlet("/SimpleServlet")
public class SimpleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
SimpleStatelessBeanRemote simpleStatelessSessionBean;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println(simpleStatelessSessionBean.getHello());
}
}
我还会看看fvu发布了什么。
仍然赞赏任何优化建议或评论。