java - 使用端口号 3700 glassfish 服务器上的 JNDI 从客户端访问 EJB 3.1

标签 java jakarta-ee ejb-3.1 openejb

我正在使用 netbeans IDE 7.1.2,并且创建了一个 EJB 3.1 Stateless Bean 并实现了远程和本地接口(interface),并将其成功部署到 glassfish 服务器 3.2.1...这是代码

_____________________CaseInfo.java_ _________________

enter code here

package maxx;

import javax.ejb.Stateless;

@Stateless(name="CaseInfo",mappedName="CaseInfoBean")
public class CaseInfo implements CaseInfoRemote, CaseInfoLocal {

@Override
public String MyCaseMessageLocal() {
    return "Hello this is my Local message.";
}

@Override
public String MyCaseMessageRemote() {
    return "Hello this is my Remote message.Please Note that this message is comming from the remote";
}

}

__________________CaseInfoLocal.java___ ________________

package maxx;

import javax.ejb.Local;

@Local
public interface CaseInfoLocal {

String MyCaseMessageLocal();

}

_________________CaseInfoRemote.java____ ______________

package maxx;

import javax.ejb.Remote;

@Remote
public interface CaseInfoRemote {

String MyCaseMessageRemote();

}


现在我已经从本地成功访问它,并且在我创建之后 新项目>Java EE>应用程序客户端项目,这是一个桌面应用程序,我通过将bean模块的jar文件作为客户端 stub 添加到其库中,成功访问了该bean,这里是一些代码

_____________________Main.java_ __________________ __

package applicationclient;

import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import maxx.CaseInfoRemote;

public class Main {


public static void main(String arg[]) {

    try {
Properties prop = new Properties();
prop.setProperty(Context.INITIAL_CONTEXT_FACTORY,
                          "com.sun.enterprise.naming.SerialInitContextFactory");
prop.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
prop.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); 

        InitialContext ic = new InitialContext(prop);
        Object ref = ic.lookup("CaseInfoBean");
        CaseInfoRemote home = (CaseInfoRemote)PortableRemoteObject.narrow(ref,
                CaseInfoRemote.class);
        System.out.println(home.MyCaseMessageRemote());

    } catch(Exception e) {
        e.printStackTrace();
    }
}
}

但是当我使用此客户端访问代码时,转到 New Project>java>java Application 并在此处编写相同的代码,因此问题显示

______________________错误___< em>____________________

run:
javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is  java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
at javax.naming.InitialContext.init(InitialContext.java:242)
at javax.naming.InitialContext.<init>(InitialContext.java:216)
at testcasebean.TestCaseBean.main(TestCaseBean.java:30)
Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:63)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:671)
    ... 4 more
BUILD SUCCESSFUL (total time: 0 seconds)
<小时/>

如果我删除代码的属性行,那么就会出现这种类型的错误

运行: javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名,或者作为小程序参数,或者在应用程序资源文件中:

java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:344)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at testcasebean.TestCaseBean.main(TestCaseBean.java:27)
BUILD SUCCESSFUL (total time: 0 seconds)

请告诉我如何通过使用简单的java桌面应用程序访问这个bean,因为使用Java EE应用程序客户端没有问题,但相同的代码给出了这些错误

最佳答案

您可能没有按照说明从独立 Java 客户端访问部署在 GlassFish 服务器上的远程 EJB。这并不完全是微不足道的。

这应该可以回答你的问题。一般来说,我怀疑您缺少的是类路径中的 gf-client.jar 文件。请按照说明操作并告知我们:

http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB

关于java - 使用端口号 3700 glassfish 服务器上的 JNDI 从客户端访问 EJB 3.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13442493/

相关文章:

spring - 将 Spring bean 注入(inject) EJB3

java - 设置/配置 EJB 定时器服务的数据源

java - 如何将actionPerformed分配给特定的actionListener?

java - 我如何编写一个函数,以 number(n) 作为输入并自动为类创建 (n) 个对象

java - 使用 EJBContainer 时如何在 jUnit 中获取 "real"异常而不是 EJBException?

java - 操作 javac -d : invalid flag? 时出错 如果我更正它,则会出现另一个 package-not-found 错误

java-ee-6 - Apache Tomee 中用于计时器执行的 EJB-3.1 @Startup 和 @Schedule 注释

java - 卡片数组 toString - Java

java - Java中的下拉菜单

tomcat - 非嵌入式tomcat有什么优势?