0

我是 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 和对带有接口的 jar 的依赖项的 Web 应用程序。

@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
4

1 回答 1

0

我已经设法让它工作了。主要问题是 SLSB 需要是远程的,因为使用它的代码不在同一个 EAR 文件中。

我这样做的方式:

仅包含接口的 Jar:

public interface SimpleStatelessBeanCommon {
    public String getHello();
}

@Local
public interface SimpleStatelessBeanLocal extends SimpleStatelessBeanCommon{
}

@Remote
public interface SimpleStatelessBeanRemote extends SimpleStatelessBeanCommon{
}

包含 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 发布的内容。

仍然感谢任何优化建议或评论。

于 2013-11-15T10:28:00.110 回答