2015-09-29 38 views
0

環境中使用無法運行EJB應用程序界面時(本地和遠程)添加

Netbeans的8.0+

的GlassFish 4+

JDK 1.8

注意這個例子中工作得很好,如果你使用無界面視圖。如果我們使用本地或遠程接口,則效果不佳。

遠程接口

package packt; 
import javax.ejb.Remote; 
@Remote 
public interface SphereBeanRemote { 
    public double computeVolume(double radius); 
} 

實現上述接口

package packt; 
import javax.ejb.Stateless; 
@Stateless 
public class SphereBean implements SphereBeanRemote { 
    @Override 
    public double computeVolume(double radius) { 
     return (4.0/3.0)*Math.PI*(radius*radius*radius); 
    } 

}

客戶(的servlet),其訪問它

import java.io.*; 
import javax.ejb.EJB; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.*; 
import packt.SphereBean; 

@WebServlet(urlPatterns = {"/SphereServlet"}) 
public class SphereServlet extends HttpServlet { 
    @EJB 
    SphereBean sphere; 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     try (PrintWriter out = response.getWriter()) { 

      out.println("<!DOCTYPE html>"); 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet SphereServlet</title>");    
      out.println("</head>"); 
      out.println("<body>"); 
      out.println("<h1>Servlet SphereServlet at " + request.getContextPath() + "</h1>"); 
      out.println("<h1>" + sphere.computeVolume(18) + "</h1>"); 
      out.println("</body>"); 
      out.println("</html>"); 
     } 
    } 

     @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     processRequest(request, response); 
    } 
     @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    @Override 
    public String getServletInfo() { 
     return "Short description"; 
    } 

} 

錯誤 HTTP狀態500 - 內部服務器錯誤

類型異常報告

messageInternal服務器錯誤

descriptionThe服務器遇到阻止其完成此請求一個內部錯誤。

例外

javax.servlet.ServletException:錯誤實例servlet類SphereServlet

根源

com.sun.enterprise.container.common.spi.util.InjectionException:錯誤創建管理對象類:類SphereServlet

根源

com.sun.enterprise.container.c ommon.spi.util.InjectionException:嘗試注入遠程ejb-ref名稱的異常= SphereServlet/sphere,遠程3.x接口= packt.SphereBean,ejb-link = null,lookup =,mappedName =,jndi-name = packt。 SphereBean,refType = Session SphereServlet:SerialContext中'java:comp/env/SphereServlet/sphere'的查找失敗[myEnv = {java.naming.factory.initial = com.sun.enterprise.naming.impl.SerialInitContextFactory,java .naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl,java.naming.factory.url.pkgs = com.sun.enterprise.naming}

根源

javax.naming.NamingException:SerialContext中'java:comp/env/SphereServlet/sphere'的查找失敗[myEnv = {java.naming.factory.initial = com.sun.enterprise.naming.impl.SerialInitContextFact ory,java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl,java.naming.factory.url.pkgs = com.sun.enterprise.naming} [根異常是javax。 naming.NamingException:爲遠程ejb-ref名稱= SphereServlet/sphere,遠程3.x接口= packt.SphereBean,ejb-link = null,lookup =,mappedName =,jndi-name = packt解析Ejb的異常。SphereBean,refType = Session'。用於查找的實際(可能是內部的)遠程JNDI名稱是'packt.SphereBean#packt.SphereBean'[根異常是javax.naming.NamingException:SerialContext中的'packt.SphereBean#packt.SphereBean'的查找失敗[myEnv = {java .naming.factory.initial = com.sun.enterprise.naming.impl.SerialInitContextFactory,java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl,java.naming.factory.url .pkgs = com.sun.enterprise.naming} [根異常是javax.naming.NameNotFoundException:packt.SphereBean#packt.SphereBean未找到]]]

根源

javax.naming.NamingException中:異常爲遠程ejb-ref名稱= SphereServlet/sphere,遠程3.x接口= packt.SphereBean,ejb-link = null,lookup =,mappedName =,jndi-name = packt解析Ejb。 SphereBean,refType = Session'。用於查找的實際(可能是內部的)遠程JNDI名稱是'packt.SphereBean#packt.SphereBean'[根異常是javax.naming.NamingException:SerialContext中的'packt.SphereBean#packt.SphereBean'的查找失敗[myEnv = {java .naming.factory.initial = com.sun.enterprise.naming.impl.SerialInitContextFactory,java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl,java.naming.factory.url .pkgs = com.sun.enterprise.naming} [根異常是javax.naming.NameNotFoundException:packt.SphereBean#packt.SphereBean未找到]]

根源

javax.naming.NamingException中:查找失敗用於SerialContext中的'packt.SphereBean#packt.SphereBean'[myEnv = {java.naming.factory.initial = com.sun.enterprise.naming.impl.SerialInitContextFactor y,java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl,java.naming.factory.url.pkgs = com.sun.enterprise.naming} [根異常是javax。 naming.NameNotFoundException:packt.SphereBean#packt.SphereBean沒有發現]

根源

javax.naming.NameNotFoundException:packt.SphereBean#packt.SphereBean沒有找到

記滿堆的痕跡GlassFish Server Open Source Edition 4.1日誌中提供了異常及其根本原因。 GlassFish應用服務器版4.1

回答

0

規範的§4.9.8指出:

以下是暴露了一個無接口視圖的會話bean的要求:

  • bean類必須指定它通過它的bean類定義或部署描述符公開無界面視圖。以下規則適用:

    • 如果bean不公開任何其他客戶端視圖(本地,遠程,無接口,2.X遠程家庭,2.X本地家庭,Web服務)和它的implements子句是空的,bean定義了一個無界面視圖。

    • 如果該bean公開至少一個其他客戶端視圖,那麼該bean將通過Bean類或部署描述符中的LocalBean註釋公開一個無界面視圖。

因此,改變你的實現:

package packt; 
import javax.ejb.Stateless; 
import javax.ejb.LocalBean; 

@LocalBean 
@Stateless 
public class SphereBean implements SphereBeanRemote { 
    @Override 
    public double computeVolume(double radius) { 
     return (4.0/3.0)*Math.PI*(radius*radius*radius); 
    } 
} 

應該爲你做的伎倆。

但是,如果您確實希望使用本地/遠程接口,然後就是注射時,你應該使用類型:

@WebServlet(urlPatterns = {"/SphereServlet"}) 
public class SphereServlet extends HttpServlet { 

    @EJB 
    SphereBeanRemote sphere; 

    ... 
+0

我想你沒有得到我的問題。我的問題如果我使用遠程或本地接口如何運行以上應用程序 – user3637305

+0

解決方案更新... –

+0

我已經添加它.Plz有適當的看看它。但仍然有錯誤 – user3637305

相關問題