简体   繁体   中英

JNDI lookup of EJB Stateless bean running on Glassfish 4

I am learning about EJB and I would like to get the following code working but so far no success. Here's my EJB project code:

@Stateless
public class CalcBean implements ICalcRemote {

    private static final long serialVersionUID = 5571798968598315142L;

    @Override
    public int add(int a, int b) {
        return a + b;
    }

}


package com.ejb.test.pckg;

import javax.ejb.Remote;

@Remote
public interface ICalcRemote extends ICalculator {

}


package com.ejb.test.pckg;

import java.io.Serializable;

public interface ICalculator extends Serializable {

    public int add(int a, int b);

}

I run glassfish-4.1.1 in Eclipse Neon.

When I deploy the EJB project, I can see the following in the log:

    2017-02-24T21:18:09.036-0400|Info: Portable JNDI names for EJB CalcBean: [java:global/EJBDemo/CalcBean, java:global/EJBDemo/CalcBean!com.ejb.test.pckg.ICalcRemote]

    2017-02-24T21:18:09.036-0400|Info: Glassfish-specific (Non-portable) JNDI names for EJB CalcBean: [com.ejb.test.pckg.ICalcRemote#com.ejb.test.pckg.ICalcRemote, com.ejb.test.pckg.ICalcRemote]

This is my client code:

    import java.util.Properties;

    import javax.naming.Context;
    import javax.naming.InitialContext;

    import com.ejb.test.pckg.ICalcRemote;

    public class Main {
        public static void main(String[] args) {

            try {

                Properties props = new Properties();
                props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
                props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
                props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
                //
                props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
                props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

                Context ctx = new InitialContext();
                ICalcRemote calc = (ICalcRemote) ctx.lookup("java:global/EJBDemo/CalcBean!com.ejb.test.pckg.ICalcRemote");
                System.out.println(calc.add(5, 7));

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

        }

        /*
         * (non-Java-doc)
         *
         * @see java.lang.Object#Object()
         */
        public Main() {
            super();
        }

    }

But I am having no luck. Any suggestions how to get this working?

Thank you!

EDIT :

This is my main (client) which includes info from the EJBDemo deployment log:

import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;

import com.ejb.test.pckg.ICalcRemote;

public class Main {
    public static void main(String[] args) {

        try {

            Properties props = new Properties();
            props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
            props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
            props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
            //
            // props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
            // props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

            /*
             * THIS IS from Glassfish log of EJBDemo deployment 
             * 
             * 2017-02-25T20:41:47.100-0400|Info: Portable JNDI names for EJB CalcBean: [java:global/EJBDemo/CalcBean,
             * java:global/EJBDemo/CalcBean!com.ejb.test.pckg.ICalcRemote] 2017-02-25T20:41:47.100-0400|Info: Glassfish-specific (Non-portable) JNDI names for EJB CalcBean:
             * [com.ejb.test.pckg.ICalcRemote#com.ejb.test.pckg.ICalcRemote, com.ejb.test.pckg.ICalcRemote]
             *
             *
             */
            Context ctx = new InitialContext();
            ICalcRemote calc = (ICalcRemote) ctx.lookup("java:global/EJBDemo/CalcBean!com.ejb.test.pckg.ICalcRemote");
            System.out.println(calc.add(5, 7));

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

    }

    /*
     * (non-Java-doc)
     *
     * @see java.lang.Object#Object()
     */
    public Main() {
        super();
    }

}

I finally got things working! Since it's been quite a process despite reading many posts related to this issue. Here are the details of my configuration. Hopefully, this will be useful to somebody.

OS : win 10 IDE : Eclipse Neon App server : Glassfish 4.1.1 JDK : 1.8.0_111

I need to mention this article which eventually led me to the answer:

http://mavicode.com/2014/08/a-standalone-client-for-ejbs-running-on-glassfish-4/

So, thanks and kudos.

First, create the EJB Demo project:

package com.ejb.test.pckg;

import java.io.Serializable;

public interface ICalculator extends Serializable {

    public int add(int a, int b);

}


package com.ejb.test.pckg;

import javax.ejb.Remote;

@Remote
public interface ICalcRemote extends ICalculator {

}

package com.ejb.test.pckg;

import javax.ejb.Stateless;

// @Stateless(mappedName = "chester")
@Stateless
public class CalcBean implements ICalcRemote {

    private static final long serialVersionUID = 5571798968598315142L;

    @Override
    public int add(int a, int b) {
        return a + b;
    }

}

Deploy it on the server (run as > run on the server) > check the log to see the JDNI info. It should look like something like this:

2017-02-25T20:41:47.100-0400|Info: Portable JNDI names for EJB CalcBean: [java:global/EJBDemo/CalcBean, java:global/EJBDemo/CalcBean!com.ejb.test.pckg.ICalcRemote] 2017-02-25T20:41:47.100-0400|Info: Glassfish-specific (Non-portable) JNDI names for EJB CalcBean: [com.ejb.test.pckg.ICalcRemote#com.ejb.test.pckg.ICalcRemote, com.ejb.test.pckg.ICalcRemote]

After that, create Application Client Project. Main.java will be created automatically. This is my main:

import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;

import com.ejb.test.pckg.ICalcRemote;

public class Main {
    public static void main(String[] args) {

        try {

            Properties props = new Properties();
            props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
            props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
            props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");

            Context ctx = new InitialContext();
            ICalcRemote calc = (ICalcRemote) ctx.lookup("java:global/EJBDemo/CalcBean!com.ejb.test.pckg.ICalcRemote");

            System.out.println(calc.add(5, 43));

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

    }

    /*
     * (non-Java-doc)
     *
     * @see java.lang.Object#Object()
     */
    public Main() {
        super();
    }

}   

At this point, my project looks like this:

在此处输入图片说明

And here comes the key part. Add a new external library from the Glassfish lib directory. !!! IMPORTANT: Don't just copy and paste to the path! The .jar apparently uses/references other classes in other GF jars. So just add it to the build path as an external jar instead of copy/paste.

You should be set now. Run the Main as a Java application.

This is what I get.

在此处输入图片说明

在此处输入图片说明

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