Java 可以从桌面应用程序调用EJB吗?

Java 可以从桌面应用程序调用EJB吗?,java,jakarta-ee,ejb-3.0,Java,Jakarta Ee,Ejb 3.0,我是JavaEJB3.0新手。是否可以从桌面应用程序客户端调用部署在JBoss上的会话bean 提前谢谢。可以。此处的一些细节参考了EJB2,但在涉及远程客户端时,EJB3的细节相同: 意译: Hashtable env = new Hashtable(); env.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); env.put("java.naming.provider.url", "

我是JavaEJB3.0新手。是否可以从桌面应用程序客户端调用部署在JBoss上的会话bean


提前谢谢。

可以。此处的一些细节参考了EJB2,但在涉及远程客户端时,EJB3的细节相同:

意译:

Hashtable env = new Hashtable();
env.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
env.put("java.naming.provider.url", "jnp://localhost:1099");
env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
Context ctx = new InitialContext(env); 
// name is whatever JNDI name you gave it 
Object o = ctx.lookup("home name"); 
EJBHome ejbHome = (EJBHome) PortableRemoteObject.narrow(o,EJBHome.class); 
// This is userID should be the one passed. 
EJB ejb = ejbHome.create(..); 

对于客户端配置,必须提供包含内容的jndi.properties文件

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost

如果您正在寻找JBoss上的工作示例,请尝试下载

的源代码,假设您有以下远程接口:

@Remote
public interface HelloBeanRemote {
    public String sayHello();
}
以及实现它的会话bean:

@Stateless
public class HelloBean implements HelloBeanRemote {
    ...
}
并且这个EJB被正确地打包并部署在JBoss上

在客户端,创建具有以下内容的jndi.properties并将其放在类路径上:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
然后使用以下代码调用EJB:

Context context;
try {
    context = new InitialContext();
    HelloBeanRemote beanRemote = (HelloBeanRemote)context.lookup("HelloBean/remote"); 
    beanRemote.test(); 
} catch (NamingException e) {
    e.printStackTrace();
    throw new RuntimeException(e);
}
或者,如果不想提供jndi.properties文件,可以在代码中显式设置jndi环境并创建如下上下文:

Properties properties = new Properties();
properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces");
properties.put("java.naming.provider.url","localhost:1099");
Context context = new InitialContext(properties);

但是为了便于移植,我建议使用jndi.properties。

您也可以将bean公开为web服务。我相信这在EJB3中是可用的。考虑到你可以用注解来做这件事,这是非常好的。您可能希望考虑使用此选项来减少耦合。这里有一个指向的链接。

@Coutney这是EJB>=2.1版本示例我不确定EJB3中的远程客户端访问是否已更改。在EJB3中,服务器端代码已经清理了很多,使用了非常棒的注释驱动配置。然而,据我所知,RMI调用的基本原理与我在解释的代码块中所展示的相同。为了理智起见,我找到了一个EJB3教程,它支持远程客户端访问在EJB2和EJB3中几乎相同的事实:非常感谢。。。“我现在正在运行它。”律师说。您粘贴的代码是EJB2.1客户端,它将与EJB3.0服务器一起工作,但此代码已过时。查看EJB3.0中不需要的主类。您确定这是使用JBoss时要查找的正确JNDI名称吗?@Pascal。是的,它来自我在回答中提到的书中的例子。
Properties properties = new Properties();
properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces");
properties.put("java.naming.provider.url","localhost:1099");
Context context = new InitialContext(properties);