2013-11-14 196 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發佈的內容。

任何優化建議或評論仍然讚賞。

相關問題