java - 尝试访问 session bean 时出错

标签 java jakarta-ee ejb-3.0 jndi

我在运行一个简单的 EJB3 cient 来访问 session bean 时遇到 javax.naming.NoInitialContextException

下面是我的客户类别:

package com.ibytecode.client;
import javax.naming.Context;
import javax.naming.NamingException;

import com.ibytecode.business.HelloWorld;
import com.ibytecode.businesslogic.HelloWorldBean;
import com.ibytecode.clientutility.ClientUtility;

public class EJBApplicationClient {

    /**
     * @param args
     */
    public static void main(String[] args) {
        HelloWorld bean = doLookup();
        System.out.println(bean.sayHello()); // 4. Call business logic
    }

    private static HelloWorld doLookup() {
        Context context = null;
        HelloWorld bean = null;
        try {
            // 1. Obtaining Context
            context = ClientUtility.getInitialContext();
            // 2. Generate JNDI Lookup name
            String lookupName = getLookupName();
            // 3. Lookup and cast
            bean = (HelloWorld) context.lookup(lookupName);

        } catch (NamingException e) {
            e.printStackTrace();
        }
        return bean;
    }

    private static String getLookupName() {
/*
The app name is the EAR name of the deployed EJB without .ear suffix.
Since we haven't deployed the application as a .ear,
the app name for us will be an empty string
*/
        String appName = "";

        /* The module name is the JAR name of the deployed EJB
        without the .jar suffix.
        */
        String moduleName = "HelloWorldSessionBean";

/*AS7 allows each deployment to have an (optional) distinct name.
This can be an empty string if distinct name is not specified.
*/
        String distinctName = "";

        // The EJB bean implementation class name
        String beanName = HelloWorldBean.class.getSimpleName();

        // Fully qualified remote interface name
        final String interfaceName = HelloWorld.class.getName();

        // Create a look up string name
        String name = "ejb:" + appName + "/" + moduleName + "/" +
            distinctName    + "/" + beanName + "!" + interfaceName;

        return name;
    }

}

以下是我收到的错误:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  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 com.ibytecode.client.EJBApplicationClient.doLookup(EJBApplicationClient.java:28)
at com.ibytecode.client.EJBApplicationClient.main(EJBApplicationClient.java:15)
Exception in thread "main" java.lang.NullPointerException
at com.ibytecode.client.EJBApplicationClient.main(EJBApplicationClient.java:16)

最佳答案

  1. 我向 eclipse 的构建路径提供了以下库,问题就消失了。
  2. 无论出于何种原因,将这些 jar 文件添加到项目中都可以消除 getlookup 错误javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名,或者作为小程序参数,或者在应用程序资源文件中:java.naming.factory.initial

3 JAR 名称 位置 jboss-transaction-api_1.1_spec-1.0.0.Final.jar AS7_HOME/modules/javax/transaction/api/main/

jboss-ejb-api_3.1_spec-1.0.1.Final.jar AS7_HOME/modules/javax/ejb/api/main/

jboss-ejb-client-1.0.0.Beta10.jar AS7_HOME/modules/org/jboss/ejb-client/main/

jboss-marshalling-1.3.0.GA.jar AS7_HOME/modules/org/jboss/marshalling/main/

xnio-api-3.0.0.CR5.jar AS7_HOME/modules/org/jboss/xnio/main/

jboss-remoting-3.2.0.CR6.jar AS7_HOME/modules/org/jboss/remoting3/main/

jboss-logging-3.1.0.Beta3.jar AS7_HOME/modules/org/jboss/logging/main/

xnio-nio-3.0.0.CR5.jar AS7_HOME/modules/org/jboss/xnio/nio/main/

jboss-sasl-1.0.0.Beta9.jar AS7_HOME/modules/org/jboss/sasl/main/

jboss-marshalling-river-1.3.0.GA.jar AS7_HOME/modules/org/jboss/marshalling/river/main/

关于java - 尝试访问 session bean 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21045330/

相关文章:

java - 根据规范,EJB 计时器调用是否可以与指定计时器重叠?

java - 运行 JAR 时为 "java.lang.ClassNotFoundException: javax.ejb.EJBObject"

java - 远程调用同一服务器上存在的 EJB 时出现 ClassCastException

java - 如何在.bash_profile 中设置JAVA_TOOL_OPTIONS?

java - 为什么是 'java.net.SocketException: jks not found' ?

java - 如何计算两次之间的差异

java - Tomcat中JasperListener和其他监听器有什么用

ejb-3.0 - 如何访问EJB3中实体类内部的EntityManager

java - 名称 ""对于 JDOM/XML 命名空间不合法

java - classname.class 返回什么?