困扰了三天三夜啊!尝试写第一个EJB遇到的问题

乐高1980 2005-02-21 11:43:48
主接口
package simpleBean;

public interface SalaryHome extends javax.ejb.EJBHome{

Salary create() throws java.rmi.RemoteException,javax.ejb.CreateException;
}
组件接口
package simpleBean;
public interface Salary extends javax.ejb.EJBObject{
double calculateSalary(int annualSalary,int pensionContrib,double bonus)
throws java.rmi.RemoteException;
}
实现类
package simpleBean;

import javax.ejb.*;

public class SalaryEJB implements SessionBean{

public void ejbCreate(){}

public void ejbRemove(){}

public void ejbActivate(){}

public void ejbPassivate(){}

public void setSessionContext(SessionContext ctx){}

private static double taxRate=28;

public double calculateSalary(int annualSalary,int pensionContrib,double bonus){

double monthly=0;
monthly=annualSalary/12;

monthly=monthly+bonus;

monthly=monthly-(monthly*(pensionContrib/100));

monthly=monthly-(monthly*(taxRate/100));

return monthly;
}
}
编写描述文件

用SUN的J2EE服务器进行部署
1.用File->New Application创建新的Application
2.add to application->EJB jar添加打包好的JAR文件
3.用Tools-deploy部署
编写客户端访问EJB
import javax.ejb.*;
import simpleBean.*;
import javax.naming.InitialContext;

class SalaryClient{

public static void main(String[] args){

try{
InitialContext ctx=new InitialContext();
Object objRef=ctx.lookup("Salary");
SalaryHome home=(SalaryHome)javax.rmi.PortableRemoteObject.narrow(
objRef,SalaryHome.class);
Salary bean=home.create();
System.out.println("Monthly net salary: "+
bean.calculateSalary(28000,2,500));
}
catch (javax.naming.NamingException ne){
System.out.println("Naming Exception caught: "+ne);
}
catch (javax.ejb.CreateException ce){
System.out.println("Create Exception caught: "+ce);
}
catch (java.rmi.RemoteException re){
System.out.println("Remote Exception caught: "+re);
}
}
}

出现如下错误:
D:\salary\client>java -classpath %J2EE_HOME%\lib\j2ee.jar;SimpleBeanClient.jar;.
SalaryClient
Naming Exception caught: 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

我在网上找了好长时间,也没有发现解决方法,请高人帮忙指点,感谢!
...全文
317 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
congbailing_914 2005-03-01
  • 打赏
  • 举报
回复
组件接口中的double calculateSalary(int annualSalary,int pensionContrib,double bonus)方法

实现类中调用了这个组件接口的方法,我觉得你的实现类是不是应该继承你的组件接口后才能用接口中的方法呢??

我是初学者,说的不对,不要笑话我!
嘿嘿
乐高1980 2005-03-01
  • 打赏
  • 举报
回复
itjourney(IT之旅) ,我早先试过你说的方法,但是不知道XXX在SUN服务器中是什么内容,现在还是改用JBOSS了
alike188 2005-02-24
  • 打赏
  • 举报
回复
主要看路径和文件名了
itjourney 2005-02-21
  • 打赏
  • 举报
回复
提示的很明显了啊。
缺java.naming.factory.initial和java.naming.provider.url
解决方法1:
HashMap map=new HashMap();
map.put("java.naming.factory.initial",xxx);
map.put("java.naming.provider.url",xxx);
ctx=new InitialContext(map);
....
解决方法2:
建立文件jndi.properties,含上述两属性即可。
hlsps 2005-02-21
  • 打赏
  • 举报
回复
看看你的jndi里有没有Salary这个对象。
yeshucheng 2005-02-21
  • 打赏
  • 举报
回复
ejb没有写错
还是在你的main上
mengfhui 2005-02-21
  • 打赏
  • 举报
回复
Object objRef=ctx.lookup("Salary");

检查一下

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧