EJB 3.1 ClassCastException glassfish服务器上的无状态会话Bean

时间:2013-11-14 13:04:48

标签: jndi ejb-3.1 classcastexception glassfish-4

我是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。

使用:

  • GlassFish4
  • EJB 3.1

1 个答案:

答案 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发布了什么。

仍然赞赏任何优化建议或评论。