2012-12-17 40 views
0

我是EJB和JBoss世界的新手,在尝试通过远程接口执行无状态bean时遇到了问题。Jboss 7.1 Ejb3 Struts2和EAR无法使用JNDI执行EJB

我在Struts ActionSupport的这样做:

public String inscrire() { 
    System.out.println("########### Inscrire Action #############"); 
    Candidat c = new Candidat(nom, prenom, mail, telephone, ecole); 
    try { 
     final Properties env = new Properties(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, 
       org.jboss.naming.remote.client.InitialContextFactory.class 
         .getName()); 
     env.put(Context.PROVIDER_URL, "remote://localhost:4447"); 
     env.put(Context.SECURITY_PRINCIPAL, "UserApp"); 
     //env.put("jboss.naming.client.ejb.context", "true"); 
     env.put(Context.SECURITY_CREDENTIALS, "password"); 
     InitialContext remoteContext = new InitialContext(env); 
     System.out.println("########## Initial Context OK ##########"); 

     servicecandidat = (CandidatSessionRemote) remoteContext 
       .lookup("java:global/EtestEAProject/EtestMetier/CandidatSession!sessions.candidat.CandidatSessionRemote"); 
     System.out.println("########## LookUp OK ##########"); 

     if (servicecandidat.inscrireCandidat(c)) 
      return SUCCESS; 
     else 
      return ERROR; 
    }catch (Exception lookupError) { 
     System.out.println("########## LookUp EcheC##########"); 
     lookupError.printStackTrace(); 
     return ERROR; 
    } 

控制台使试图执行梅索德

15:01:45,474 INFO [stdout] (http-localhost-127.0.0.1-8080-1) ########## Initial Context OK ########## 

15:01:45,680 INFO [stdout] (http-localhost-127.0.0.1-8080-1) ########## LookUp ExcheC########## 

15:01:45,682 ERROR [stderr] (http-localhost-127.0.0.1-8080-1) javax.naming.NameNotFoundException: global/EtestEAProject/EtestMetier/CandidatSession!sessions.candidat.CandidatSessionRemote -- service jboss.naming.context.java.jboss.exported.global.EtestEAProject.EtestMetier."CandidatSession!sessions.candidat.CandidatSessionRemote" 

15:01:45,685 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)  at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:97) 

15:01:45,687 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)  at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178) 
........................... 

和EJB JAR部署时,如下因素命名exeption说:

java:global/EtestEAProject/EtestMetier/CandidatSession!sessions.candidat.CandidatSessionRemote 

    java:app/EtestMetier/CandidatSession!sessions.candidat.CandidatSessionRemote 

    java:module/CandidatSession!sessions.candidat.CandidatSessionRemote 

    java:jboss/exported/EtestEAProject/EtestMetier/CandidatSession!sessions.candidat.CandidatSessionRemote 

    java:global/EtestEAProject/EtestMetier/CandidatSession!sessions.candidat.CandidatSessionLocal 

    java:app/EtestMetier/CandidatSession!sessions.candidat.CandidatSessionLocal 

    java:module/CandidatSession!sessions.candidat.CandidatSessionLocal 
+0

您是否从不同的JVM进行远程处理?或者在同一个JVM中只是一个不同的部署(或子部署)? – jyore

+0

感谢jyore为你回答我是从Web应用程序中使用另一个JVM的Web应用程序的远程处理,我想... –

+0

我会试图澄清,在同一个jboss实例中的应用程序?他们是否在同一个EAR?或者他们在一起在单独的机器上?相信与否,这决定了您使用的是哪个JNDI名称。 – jyore

回答

0

好的,因为你的软件包如下:

EAR 
|-- WAR 
`-- EJB-JAR 

然后做EJB查找最好的办法是:

ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-remote-interface> 

你的情况:

ejb:EtestEAProject/EtestMetier//CandidatSession!sessions.candidat.CandidatSessionRemote 

是的, '//' 是正确的,因为不同的名称为空串。

是得到一个方法执行查询应该是这样的:

public CandidatSessionRemote getEJB() { 
    Hashtable jndiProperties = new Hashtable(); 
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
    Context context = new InitialContext(jndiProperties); 
    return (CandidateSessionRemote) context.lookup("ejb:EtestEAProject/EtestMetier//CandidatSession!sessions.candidat.CandidatSessionRemote"); 
} 

希望这有助于和请让我知道,如果您有任何其他问题。

+0

@ Lord-zed,这个答案有帮助吗?如果是这样,请接受答案。如果没有,请让我知道为什么,我可以尝试进一步帮助。 – jyore

+0

如果你在同一个EAR中,你可以(应该)使用本地接口。至少在AS 6和之前,默认的初始上下文(不带参数)就足以查找bean。本地不应该需要JBoss特定的ejb:命名空间。 Java EE为本地bean提供了可移植的名称,即使是“反叛AS”的JBoss AS 7也必须实施。 –