我正在学习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();
}
}
答案 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();
}
}
此时,我的项目看起来像这样:
这是关键部分。从Glassfish lib目录添加新的外部库。 !重要提示:不要只是复制并粘贴到路径上! .jar显然使用/引用其他GF罐中的其他类。因此,只需将其作为外部jar添加到构建路径,而不是复制/粘贴。
你现在应该被设定。将Main作为Java应用程序运行。
这就是我得到的。