【问题标题】:EJB 3.1 ClassCastException Stateless Session Bean on glassfish serverglassfish 服务器上的 EJB 3.1 ClassCastException 无状态会话 Bean
【发布时间】: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


【解决方案1】:

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

我的做法:

只包含接口的Jar:

public interface SimpleStatelessBeanCommon {
    public String getHello();
}

@Local
public interface SimpleStatelessBeanLocal extends SimpleStatelessBeanCommon{
}

@Remote
public interface SimpleStatelessBeanRemote extends SimpleStatelessBeanCommon{
}

包含 Bean 实现的 War(依赖于带有接口的 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-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2012-03-24
    相关资源
    最近更新 更多