2013-11-14 140 views
0

我是EJB的新手,我试图让一个简单的无状态会话Bean工作。EJB 3.1 ClassCastException glassfish服务器上的无状态会话Bean

我为此使用了glassfish。

我做了什么:

我创建包含接口的JAR文件:

@Local 
public interface SimpleStatelessBeanLocal { 
    public String getHello(); 
} 

,我已经创建了包含以下类我EJB战争文件(用依赖于与接口的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 

所以basicaly它找到的豆,其实现该接口,但它不是从当前类加载器该接口,的一个实例,这意味着我不能投它。

有什么我在这里做错了吗? 我很确定除了反射之外还有其他解决方法吗?

我已经尝试过: 我发现一篇文章建议将jar与接口放在一起提供,但后来我得到了一个ClassNotFoundException。

使用:

  • GlassFish4
  • EJB 3.1
+1

不直接相关,但我想知道为什么你使用上下文查找而不是@EJB注入?此外,EJB3.1旨在变得简单(只要遵循规则手册:),即使没有接口,您在这里尝试的也应该可以像EJB 3那样工作。1 Lite),我可以推荐最优秀的[Oracle JavaEE教程](http://docs.oracle.com/javaee/7/tutorial/doc/javaeetutorial7.pdf)来帮助您入门吗?和 – fvu

+0

@fvu以下您发布的文档链接,我能够做出成功的SLSB例子。这个例子的缺点是SLSB和实际的代码在同一个war文件中。我真正需要的是ejb在单独的战争中,因为最终我们会有多个使用相同EJB的项目。我的下一步是看看它是否仍然有效,如果我将它们分成两个不同的战争。 –

+0

请参阅本教程的第5.2章,针对您的应用程序,我将打包并部署EJB作为EJB-jar,EJB3样式 - 可选地将WAR与WAR一起包装在EAR中。现在,本教程的第7版似乎将重点放在新的无界面模型上,您会注意到[同一教程的第5版](http://docs.oracle.com/javaee/5/tutorial/doc/)显示一个完整的示例EJB,它公开了明确的本地和远程接口,从这个示例开始可能更容易。 – fvu

回答

0

我已经成功地得到它的工作。 主要问题是SLSB需要是远程的,因为使用它的代码不在同一个EAR文件中。

我的方式做到了:

罐只包含接口:

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"; 
    } 
} 

战争用豆战争(依赖于与接口罐)

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

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

相关问题