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

时间:2009-12-07 19:48:51

标签: java java-ee ejb-3.0

我是Java EJB 3.0的新手。可以从桌面应用程序客户端调用部署在JBoss上的(会话)bean吗?

提前致谢。

4 个答案:

答案 0 :(得分:3)

是的,你可以。这里有一些细节(引用EJB2,但对于远程客户端,它与EJB3相同):http://www.theserverside.com/discussions/thread.tss?thread_id=9197

意译:

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(..); 

答案 1 :(得分:1)

public static void main(String args[]) throws Exception {

   InitialContext ctx = new InitialContext();
   YourService yourService = (YourService) ctx.lookup("com.example.session.YourService");
   String time = yourService.getTime();
   System.out.println("Time is: " + time);
}

对于客户端配置,您必须提供内容为

的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上的工作示例,请尝试下载Enterprise JavaBeans 3.0, Fifth Edition

的源代码

答案 2 :(得分:1)

假设您有以下远程接口:

@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

答案 3 :(得分:0)

您还可以将bean公开为Web服务。我相信这是从EJB 3开始提供的。考虑到你可以使用注释来实现它,这是非常好的。您可能希望考虑使用此选项来减少耦合。这是指向tutorial的链接。