简体   繁体   中英

Error while trying to access a session bean

I am getting javax.naming.NoInitialContextException while running a simple EJB3 cient to access a session bean.

Below is my client class:

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;
    }

}

Below is the error I am getting:

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. I supplied the following libraries to the build path of eclipse and the problem went away.
  2. For whatever reason adding these jar files to the project gets rid of the getlookup errorjavax.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

3 JAR name Location 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/

I think you should run your code inside an application client, and it will create the initial context for you. See Java EE Application client container for more details.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM