在Glassfish 4上运行的EJB无状态bean的JNDI查找

时间:2017-02-25 02:03:32

标签: java glassfish ejb

我正在学习EJB,我希望得到以下代码,但到目前为止还没有成功。 这是我的EJB项目代码:

@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);

}

我在Eclipse Neon中运行glassfish-4.1.1。

当我部署EJB项目时,我可以在日志中看到以下内容:

    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]

这是我的客户代码:

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

    }

但我没有运气。有任何建议如何使这个工作?

谢谢!

编辑

这是我的主要(客户端),其中包含来自EJBDemo部署日志的信息:

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

}

1 个答案:

答案 0 :(得分:1)

我终于让事情奏效了!尽管阅读了许多与此问题相关的帖子,但这是一个非常流程的过程。以下是我配置的详细信息。希望这对某些人有用。

操作系统:赢10 IDE :Eclipse Neon 应用服务器:Glassfish 4.1.1 JDK :1.8.0_111

我需要提一下这篇文章,最终让我得到答案:

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

所以,谢谢,并且赞不绝口。

首先,创建EJB Demo项目:

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

}

将其部署在服务器上(在服务器上运行>运行)>检查日志以查看JDNI信息。它应该看起来像这样:

  

2017-02-25T20:41:47.100-0400 | Info:EJB的可移植JNDI名称   CalcBean:[java:global / EJBDemo / CalcBean,   Java的:全球/ EJBDemo / CalcBean com.ejb.test.pckg.ICalcRemote]   2017-02-25T20:41:47.100-0400 |信息:Glassfish特定(非便携式)   EJB CalcBean的JNDI名称:   [com.ejb.test.pckg.ICalcRemote#com.ejb.test.pckg.ICalcRemote,   com.ejb.test.pckg.ICalcRemote]

之后,创建Application Client Project。 Main.java将自动创建。这是我的主要内容:

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

}   

此时,我的项目看起来像这样:

enter image description here

这是关键部分。从Glassfish lib目录添加新的外部库。 !重要提示:不要只是复制并粘贴到路径上! .jar显然使用/引用其他GF罐中的其他类。因此,只需将其作为外部jar添加到构建路径,而不是复制/粘贴。

你现在应该被设定。将Main作为Java应用程序运行。

这就是我得到的。

enter image description here

enter image description here