我正在尝试从Java EE客户端应用程序访问EJB3,但除了查找失败之外什么也得不到。客户端应用程序在Java EE应用程序客户端容器中运行。
我的Java EE应用程序'CoreServer'暴露了许多带有远程接口的bean。从部署在同一Glassfish v3.0.1上的Web应用程序访问它们没有问题。
现在我正在尝试从客户端应用程序访问它:
public class Main {
public static void main(String[] args) {
CampaignControllerRemote bean = null;
try {
InitialContext ctx = new InitialContext();
bean = (CampaignControllerRemote) ctx.lookup("java:global/CoreServer/CampaignController");
} catch (Exception e) {
System.out.println(e.getMessage());
}
if (bean != null) {
Campaign campaign = bean.get(361);
if (campaign != null) {
System.out.println("Got "+ campaign);
}
}
}
}
当我运行部署到Glassfish并从appclient运行它时,我收到此错误:
Lookup failed for 'java:global/CoreServer/CampaignController' in SerialContext targetHost=localhost,targetPort=3700,orb'sInitialHost=localhost,orb'sInitialPort=3700
然而,这与我从WebApplication查找bean时使用的JNDI名称完全相同(通过SessionContext,而不是InitialContext - 这有关系吗?)。此外,当我部署'CoreServer'时,Glassfish报告:
Portable JNDI names for EJB CampaignController : [java:global/CoreServer/CampaignController!mvs.api.CampaignControllerRemote, java:global/CoreServer/CampaignController]
Glassfish-specific (Non-portable) JNDI names for EJB CampaignController : [mvs.api.CampaignControllerRemote, mvs.api.CampaignControllerRemote#mvs.api.CampaignControllerRemote]
我尝试了所有四个名字,但都没有。 appclient是否无法使用(仅)远程接口访问bean?
答案 0 :(得分:1)
如果您正在谈论应用程序客户端,请使用以下答案:
不要打扰jndi查找;您可以将@EJB注入到应用程序类的 static 字段中。
答案 1 :(得分:1)
您是否尝试过 java:global / CoreServer / CampaignController!mvs.api.CampaignControllerRemote 而不是 java:global / CoreServer / CampaignController ?
答案 2 :(得分:0)
如果您正在谈论独立客户端,请使用以下答案:
这是我用于glassfish v2的JNDI查找的方法,它可能与v3非常相似:
private void lookupJndi() {
final Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.enterprise.naming.SerialInitContextFactory");
String host = "hostname.domain";
logger.log(Level.INFO, "Connecting to CORBA Host: " + host);
props.setProperty("org.omg.CORBA.ORBInitialHost", host);
try {
InitialContext ic = new InitialContext(props);
scheduleManager = (ScheduleManagerRemote) ic.lookup("ScheduleManagerRemote");
experimentManager = (ExperimentManagerRemote) ic.lookup("ExperimentManager");
facilityManager = (FacilityManagerRemote) ic.lookup("FacilityManager");
} catch (NamingException e) {
...
}
关键部分是获取com.sun INITIAL_CONTEXT_FACTORY。还要确保您的应用程序捆绑了所有glassfish依赖项。对于glassfish v2,有很多。 v2罐子是:javaee,appserv-rt,appserv-ext,appserv-admin,appserv-deployment-client。
使用v3可能会简单得多,但这绝对适用于v2.x
答案 3 :(得分:0)