2012-11-14 31 views
2

是否可以通過使用RPC寫入GWT客戶端模塊的EJB遠程接口方法? gwt應用程序位於帶Tomcat的服務器上,EJB部署在Jboss服務器中。如果它可能,我可以找到示例代碼?call ejb remote

+3

(幾乎)任何事情都有可能給予時間和金錢 - 你試過了什麼? –

+1

我試圖用annotations調用ejb,並使用此鏈接http://theopentutorials.com/examples/java-ee/ejb3/how-to-create-a-simple-ejb3-project-in-eclipse- jboss-7-1/ – blink89

回答

3

您提供的教程看起來很好,雖然它是針對命令行應用程序的,但對於部署在Tomcat上的應用程序,相同的概念應該可以工作。你發現了什麼問題?

在這裏,你已經一個簡單的例子:讓我們假設你的EJB部署與JBoss上這個簡單的接口:

package ejb.example; 
import javax.ejb.Remote; 
@Remote 
public interface Example { 
    public String hello (String nom); 
} 

的代碼可以訪問該EJB遠程應類似於:

// Simple EJB Client example 
package ejbclient.example 
import java.util.Properties; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import ejb.example.Example; // Need to import the remote interface of the bean 
public class ClientEJB { 
    public static void main(String[] args) { 
     try { 
     // Set the properties to JBoss access 
     Properties environment = new Properties(); 
     environment.put(Context.INITIAL_CONTEXT_FACTORY,  
           "org.jnp.interfaces.NamingContextFactory"); 
     environment.put(Context.PROVIDER_URL,"yourjboserver.com:1099"); 
     InitialContext context = new InitialContext(environment); 

     // Once the proper context is set, we can obtain the dynamic proxy 
     Example accessEJB = (Example) 
            context.lookup("ExampleBean/remote"); 
     // And finally we're done! We can access the EJB as if it was a regular object 
     String result = accessEJB.hello("Kate")); 
     } catch (NamingException e) { 
     e.printStackTrace(); 
     } 
    } 
} 

事情要記住:

A.正如在​​本教程的說,而不是硬編碼在源代碼中的上下文屬性,你可以定義他們在jndi.properties文件中,這樣的事情:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory 
java.naming.provider.url=yourJBossServer.com:JBossJNPPort 

,這個文件應該放在classpath中,因此,在代碼中你只需要撥打:

InitialContext context = new InitialContext(); 

該解決方案是優選的和更優雅的(它允許你改變值而不需要重新編譯客戶端)

B.注意context.lookup(「ExampleBean/remote」)語句:默認情況下,JBoss分配接口的JNDI爲類的Bean(實現)的名稱與sufix「/ remot e「或」/ local「,具體取決於接口的種類。這是爲了將EJB直接部署在jar文件中,如果將EJB放入EAR中,它會將ear文件的名稱添加爲前綴(例如,您的EJB-jar在耳朵中稱爲myapp.ear)應該查找的是:「myapp/ExampleBean/remote」)。當然,您可能已經更改了EJB中的JNDI名稱(使用了註釋或使用其部署描述符),在這種情況下,您必須使用這些名稱。另一方面,您還需要在類路徑中包含本教程中列出的JBoss客戶端庫(您可以將它們放在您的戰爭的wEB-INF/lib文件夾中)。 D.最後,你還需要在你的類路徑中使用遠程接口。

我希望它有幫助!

+0

感謝您的幫助。現在我有這個錯誤:javax.naming.NameNotFoundException:名稱[ejb:/ .... EJB // HelloWorldBean!.... helloworld.HelloWorld]沒有綁定在這個上下文中。無法找到[ejb:]。爲什麼? – blink89

+0

也許你正在向查找函數傳遞一個不正確的JNDI名稱。檢查EJB是否真正註冊了您在JBoss中使用的名稱。部署EJB時,您可以在JBoss日誌中看到JNDI名稱。 – Toni

+0

我不明白在哪裏把jndi屬性 – blink89