虽然我之前使用过EJB,但我想再次向自己保证,我了解它是如何运作的。
因此,我创建了一个简单会话Bean EJB(3.1),并将其打包为.ear(也包含客户端jar)。以下是片段:
package com.example;
import javax.ejb.Stateless;
@Stateless
public class FirstSessionEJB implements FirstSessionEJBRemote {
public FirstSessionEJB() {
}
@Override
public String print() {
return "Hello";
}
}
package com.example;
import javax.ejb.Remote;
@Remote
public interface FirstSessionEJBRemote {
public String print();
}
我将此EJB部署为.ear,并在Wildfly 10.x
中成功部署。
现在,我想使用独立的Java客户端访问它,在单独的JVM中运行。
package com.example.main;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.example.FirstSessionEJBRemote;
public class Main {
public static void main(String[] args) throws NamingException {
String GLOBAL_JNDI_NAME="java:global/FirstEJBProjEAR/FirstEJBProj/FirstSessionEJB!com.example.FirstSessionEJBRemote";
Hashtable<String,String> jndiProperties = new Hashtable<>();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
InitialContext ic = new InitialContext(jndiProperties);
FirstSessionEJBRemote ejbRemote = null;
ejbRemote = (FirstSessionEJBRemote)ic.lookup(GLOBAL_JNDI_NAME);
ejbRemote.print();
}
}
我提到了this关于如何进行JNDI查找的链接(以及所使用的所有参数,但它不起作用。)
在链接中提到它具有Wildfly特定的jar,它在没有JNDI查找的情况下工作。
任何人都可以帮助我理解:
1)我需要为JNDI设置的所有属性是什么?
2)客户端应用程序中是否需要存在任何特定的jar?
我不想使用任何特定的Wildfly jar,也就是说,我想使用传统的JNDI查找,所以有人可以指导我吗?
为了写一个简单的“你好世界”而奋斗是非常令人沮丧的。一种EJB。我提到一些书很好,但他们所提供的只是&#34;查找&#34;代码没有实际告诉JNDI和任何要包含的jar都需要包含所有属性。
答案 0 :(得分:2)
正如您链接到状态的文章虽然有点隐藏在那一堆文本中,但您确实需要在Wildfly服务器安装中找到的jboss-client.jar(bin / client / jboss-client.jar);它需要在客户端的运行时类路径上。它包含从代码中引用的 org.jboss.ejb.client.naming 包开始。
jar包含了额外的魔力,让客户能够使用Wildfly服务器设置和维护EJB远程调用,只需使用JNDI就不会削减它。并且没有一个jar可以统治它们,每个容器(Wildfly,Glassfish,Weblogic等)都有自己的客户端库实现。
请注意,从客户端应用程序调用EJB是非常古老的学校(请阅读:您不希望这样做)。 EJB技术的更现实和现代的观点是在企业容器本身中使用它,例如来自Web应用程序/战争 - 例如作为RESTful服务的一部分。您可能甚至不需要额外的EAR文件层,您可以将所有内容整齐地打包到一个war应用程序中。
在这种情况下,如果您有客户端应用程序,该客户端可以与RESTful服务进行通信 - 这是一种更简单,跨服务器,跨平台的通信接口。