是否可以从使用 RPC 编写的 GWT 客户端模块访问 EJB 远程接口方法?gwt 应用程序位于带有 Tomcat 的服务器上,而 EJB 部署在 Jboss 服务器上。如果可能的话,我在哪里可以找到示例代码?
1 回答
您提供的教程看起来不错,虽然它适用于命令行应用程序,但同样的概念应该适用于部署在 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
这个文件应该放在类路径中,因此,在代码中你只需要调用:
InitialContext context = new InitialContext();
此解决方案更受欢迎且更优雅(它允许您在不重新编译客户端的情况下更改值)
B. 注意 context.lookup("ExampleBean/remote") 语句:默认情况下,JBoss 将接口的 JNDI 分配为类 Bean(实现)的名称,后缀为“/remote”或“/local”取决于接口的类型。对于直接部署在 jar 文件中的 EJB,如果 EJB 放置在 EAR 中,它会添加 ear 文件的名称作为前缀(例如,您的 EJB-jar 位于名为 myapp.ear 的耳朵中应该查找的是:“myapp/ExampleBean/remote”)。当然,您可能已经更改了 EJB 中的 JNDI 名称(使用注释或使用其部署描述符),在这种情况下,您将不得不使用这些名称。
C. 另一方面,您还需要在类路径中拥有 JBoss 客户端库,它们也在教程中列出(您可以将它们放在您的战争的 wEB-INF/lib 文件夹中)。
D. 最后,您还需要类路径中的远程接口。
我希望它有帮助!