2010-03-28 83 views
2

我正在将Web应用程序(gwt,jpa)合并到单独的2应用程序(ejb/jpa中的企业登录和gwt中的Web客户端)中。目前我无法从Web应用程序注入我的bean(简单servlet)如何在Servlet中使用EJB 3.1 DI? (无法通过@EJB从Web应用程序注入会话Bean)

我正在使用glassfish v3。 模块limbo(ejb jar)依赖于模块lust(战争)。

如果我使用lust编译器输出的limbo,那么所有工作都很完美(如果web应用程序中的ejb和作为一个应用程序一起部署)。

我搞砸了一些容器配置?

这里是我的步骤:

我有一些limbo.jar(EJB-JAR)部署到EJB容器。我不使用任何ejb-jar.xml,只有注释。


package ua.co.inferno.limbo.persistence.beans; 

import javax.ejb.Remote; 

@Remote 
public interface IPersistentServiceRemote { 
ArrayList<String> getTerminalACPList(); 

ArrayList<String> getBoxACPList(); 

ArrayList<String> getCNPList(); 

ArrayList<String> getCNSList(); 

String getProductNamebyID(int boxid); 

ArrayList<String> getRegionsList(String lang); 

long getSequence();  

void persistEntity (Object ent); 
} 

package ua.co.inferno.limbo.persistence.beans; 

import ua.co.inferno.limbo.persistence.entitis.EsetChSchemaEntity; 
import ua.co.inferno.limbo.persistence.entitis.EsetKeyActionsEntity; 
@Local 
public interface IPersistentService { 
ArrayList<String> getTerminalACPList(); 

ArrayList<String> getBoxACPList(); 

ArrayList<String> getCNPList(); 

ArrayList<String> getCNSList(); 

String getProductNamebyID(int boxid); 

ArrayList<String> getRegionsList(String lang); 

long getSequence(); 

long persistPurchaseBox(EsetRegPurchaserEntity rp); 

void removePurchaseTempBox(EsetRegPurchaserTempEntity rpt); 

EsetRegionsEntity getRegionsById(long rid); 

void persistEntity (Object ent); 
} 

package ua.co.inferno.limbo.persistence.beans; 

import ua.co.inferno.limbo.persistence.entitis.EsetChSchemaEntity; 
import ua.co.inferno.limbo.persistence.entitis.EsetKeyActionsEntity; 
import ua.co.inferno.limbo.persistence.entitis.EsetRegBoxesEntity; 

import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

@Stateless(name = "PersistentService") 
public class PersistentServiceEJB 
    implements 
    IPersistentService, IPersistentServiceRemote{ 
@PersistenceContext(unitName = "Limbo") 
EntityManager em; 

public PersistentServiceEJB() { 
} 
......... 
} 

比我试图在lust.war从Web应用程序中PersistentService会话bean(包括在limbo.jar)(冷宫.jar & lust.war是不在耳朵


package ua.co.lust; 

import ua.co.inferno.limbo.persistence.beans.IPersistentService; 

import javax.ejb.EJB; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 

@WebServlet(name = "ServletTest", 
    urlPatterns = {"/"}) 
public class ServletTest extends HttpServlet { 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws   ServletException, IOException { 

    service(request, response); 
} 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    service(request, response); 
} 



@EJB 
private IPersistentService pService; 


public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    String hi = pService.getCNPList().toString(); 

    System.out.println("testBean.hello method returned: " + hi); 
    System.out.println("In MyServlet::init()"); 
    System.out.println("all regions" + pService.getRegionsList("ua")); 
    System.out.println("all regions" + pService.getBoxACPList()); 


    } 
} 

web.xm


<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
      version="3.0"> 

    <servlet> 
     <servlet-name>ServletTest</servlet-name> 
     <servlet-class>ua.co.lust.ServletTest</servlet-class> 
    </servlet> 

</web-app> 

当的servelt是装载我GE 404 eror(所请求的资源()不可用。)

个错误日志:

全球

Log Level 
SEVERE 
Logger 
global 
Name-Value Pairs 
{_ThreadName=Thread-1, _ThreadID=31} 
Record Number 
1421 
Message ID 
Complete Message 
Class [ Lua/co/inferno/limbo/persistence/beans/IPersistentService; ] not found. Error while loading [ class ua.co.lust.ServletTest ] 

javax.enterprise.system.tools.deployment.org.glassfish.deployment。常见

Log Level 
WARNING 
Logger 
javax.enterprise.system.tools.deployment.org.glassfish.deployment.common 
Name-Value Pairs 
{_ThreadName=Thread-1, _ThreadID=31} 
Record Number 
1422 
Message ID 
Error in annotation processing 
Complete Message 
java.lang.NoClassDefFoundError: Lua/co/inferno/limbo/persistence/beans/IPersistentService; 

EJB JAR部署这一信息日志:


Log Level 
INFO 
Logger 
javax.enterprise.system.container.ejb.com.sun.ejb.containers 
Name-Value Pairs 
{_ThreadName=Thread-1, _ThreadID=26} 
Record Number 
1436 
Message ID 
Glassfish-specific (Non-portable) JNDI names for EJB PersistentService 
Complete Message 
[ua.co.inferno.limbo.persistence.beans.IPersistentServiceRemote#ua.co.inferno.limbo.persistence.beans.IPersistentServiceRemote, ua.co.inferno.limbo.persistence.beans.IPersistentServiceRemote] 

Log Level 
INFO 
Logger 
javax.enterprise.system.tools.admin.org.glassfish.deployment.admin 
Name-Value Pairs 
{_ThreadName=Thread-1, _ThreadID=26} 
Record Number 
1445 
Message ID 
Complete Message 
limbo was successfully deployed in 610 milliseconds. 

做我的东东添加的情况下,一些额外的配置注射来自他人的申请?

有些想法?


在@Remote的情况下

package ua.co.lust; 

import ua.co.inferno.limbo.persistence.beans.PersistentServiceRemote; 

import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 

@WebServlet(name = "ServletTest", 
     urlPatterns = {"/"}) 
public class WebTestServlet extends HttpServlet { 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     service(request, response); 
    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     service(request, response); 
    } 


// @EJB 
// private PersistentServiceRemote pService; <<-- DI not working :(- same errs as with Local interface (class not found) 

    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, 
      IOException { 

     Context ctx = null; 
     try { 
      ctx = new InitialContext(); 
      PersistentServiceRemote pService = 
        (PersistentServiceRemote) ctx.lookup("java:global/limbo/PersistentServiceBean!ua.co.inferno.limbo.persistence.beans.PersistentServiceRemote"); 

      String hi = pService.getCNPList().toString(); 


      System.out.println("testBean.hello method returned: " + hi); 
      System.out.println("In MyServlet::init()"); 
      System.out.println("all regions" + pService.getRegionsList("ua")); 
      System.out.println("all regions" + pService.getBoxACPList()); 

     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 


    } 
} 

登录:

 Log Level 
     SEVERE 
     Logger 
     javax.enterprise.system.std.com.sun.enterprise.v3.services.impl 
     Name-Value Pairs 
     {_ThreadName=Thread-1, _ThreadID=32} 
     Record Number 
     1963 
     Message ID 
     javax.naming.NamingException 
     Complete Message 
     Lookup failed for 'java:global/limbo/PersistentServiceBean!ua.co.inferno.limbo.persistence.beans.PersistentServiceRemote' in SerialContext [Root exception is javax.naming.NamingException: ejb ref resolution error for remote business 
    interfaceua.co.inferno.limbo.persistence.beans.PersistentServiceRemote [Root exception is java.lang.ClassNotFoundException: ua.co.inferno.limbo.persistence.beans.PersistentServiceRemote]] at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442) at 
    javax.naming.InitialContext.lookup(InitialContext.java:392) at javax.naming.InitialContext.lookup(InitialContext.java:392) at 
ua.co.lust.WebTestServlet.service(WebTestServlet.java:45) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at 
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at 
    com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipel 
ine.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at 
    org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at 
    com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at 
com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at 
com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at 
com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at 
com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:619) Caused by: javax.naming.NamingException: ejb ref resolution error for remote business interfaceua.co.inferno.limbo.persistence.beans.PersistentServiceRemote [Root exception is java.lang.ClassNotFoundException: ua.co.inferno.limbo.persistence.beans.PersistentServiceRemote] at com.sun.ejb.EJBUtils.lookupRemote30BusinessObject(EJBUtils.java:430) at 
com.sun.ejb.containers.RemoteBusinessObjectFactory.getObjectInstance(RemoteBusinessObjectFac 
tory.java:70) at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304) at 
com.sun.enterprise.naming.impl.SerialContext.getObjectInstance(SerialContext.java:472) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:437) ... 28 more 
Caused by: java.lang.ClassNotFoundException: ua.co.inferno.limbo.persistence.beans.PersistentServiceRemote at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at 
java.net.URLClassLoader.findClass(URLClassLoader.java:188) at org.glassfish.web.loader.WebappClassLoader.findClass(WebappClassLoader.java:959) at 
org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1430) at com.sun.ejb.EJBUtils.getBusinessIntfClassLoader(EJBUtils.java:678) at 
com.sun.ejb.EJBUtils.loadGeneratedRemoteBusinessClasses(EJBUtils.java:459) at com.sun.ejb.EJBUtils.lookupRemote30BusinessObject(EJBUtils.java:410) ... 32 more 

信息部署登录

Log Level 
INFO 
Logger 
javax.enterprise.system.container.ejb.com.sun.ejb.containers 
Name-Value Pairs 
{_ThreadName=Thread-1, _ThreadID=11} 
Record Number 
1899 
Message ID 
Portable JNDI names for EJB PersistentServiceBean 
Complete Message 
[java:global/limbo/PersistentServiceBean!ua.co.inferno.limbo.persistence.beans.PersistentServiceRemote, java:global/limbo/PersistentServiceBean!ua.co.inferno.limbo.persistence.beans.PersistentServiceLocal] 

如果我正在使用远程业务逻辑调用,是否需要将我的ejb jar包括到WEB = INF/lib中? 为什么DI不能在远程的情况下工作?

和它的工作知府,如果我包括来自地狱模块 编译输出和 提供:

PersistentServiceRemote pService = 
        (PersistentServiceRemote) ctx.lookup("java:global/lust/PersistentServiceBean!ua.co.inferno.limbo.persistence.beans.PersistentServiceRemote"); 

为什么我couldn`t仰望的PersistentServiceRemote(PersistentServiceBean的远程接口)的另一Web应用程序 ?

通过sample`s代码的GlassFish它应该工作(

任何想法?


确定。因此,作为帕斯卡尔说,我们需要打包Web应用程序远程接口,我们可以使用本地接口注入不同的应用程序如果你需要使用本地接口,你需要在你的应用程序中包含ejb jar当前设计 - 包webapp远程接口

+0

在您的web-app部署远程接口后,您是否可以注入远程bean? (如果是这样,我会很感激你告诉我如何)如果没有,你知道是否有一个不同的方式,然后手动jndi查找?也许3.1有关。在此先感谢 – Ittai 2011-03-17 19:36:54

回答

1

如果你不部署你的ejb-jar a是你的战争的一部分(即在WEB-INF/lib下),我认为你不能使用本地接口(并且你必须将远程接口打包到你的web应用程序中)。

PS:在这里你并不需要web.xml

+0

谢谢。 是的,您的权利... -------------- https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#CrossAppLocalAccess - I有一个带有本地接口的EJB组件。我可以从其他应用程序中的Web组件访问它吗? 不需要。EJB规范只需要在同一个JVM中的相同应用程序中访问EJB组件的本地EJB接口。一种选择是将ejb-jar打包成与.war相同的.ear文件。如果使用GlassFish v3,第二个选项是直接在.war中打包EJB组件。 - 什么是@Remote是我的选择吗? – 2010-03-28 22:43:23

+0

好的。就像帕斯卡说的那样。我们需要将远程接口打包到webapp中。 我们可以在不同的应用程序中使用本地接口注入。 如果您需要使用本地界面,您需要在应用程序中包含ejb jar。 当前设计 - 将webapp远程接口包装 – 2010-03-29 00:23:06