biti509
发贴: 1
积分: 0
|
于 2005-08-31 19:46
各位,我实在没办法了,网上找来找去也没有对号的解释,也没有完全手把手的实现的例子 ,只好向各位求救 我参考了这篇文章http://dev.csdn.net/develop/article/19/19647.shtm 在jboss4(jboss3也试过)下实现一个简单的sessionBean总是不成功。
<<1>>Hello.java
import java.rmi.RemoteException; import javax.ejb.EJBObject;
public interface Hello extends javax.ejb.EJBObject { public String hello() throws java.rmi.RemoteException; }
<<2>>HelloHome.java
import java.rmi.RemoteException;
public interface HelloHome extends javax.ejb.EJBHome { Hello create() throws java.rmi.RemoteException,javax.ejb.CreateException; }
<<3>>HelloBean.java import javax.ejb.SessionBean; import javax.ejb.SessionContext;
public class HelloBean implements javax.ejb.SessionBean { private SessionContext ctx; public void ejbCreate() { System.out.println("ejbCreate()"); } public void ejbRemove() { System.out.println("ejbRemove()"); } public void ejbActivate() { System.out.println("ejbActivate()"); } public void ejbPassivate() { System.out.println("ejbPassivate()"); } public void setSessionContext(javax.ejb.SessionContext ctx) { his.ctx = ctx; } public String hello() { System.out.println("hello()"); return "hello,world"; } } <<4>>ejb-jar.xml <?xml version="1.0"?> <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
<ejb-jar> <enterprise-beans> <session> <ejb-name>Hello</ejb-name> <home>HelloHome</home> <remote>Hello</remote> <ejb-class>HelloBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar>
<<5>>jboss.xml <?xml version="1.0" encoding="UTF-8"?> <jboss> <enterprise-beans> <session> <ejb-name>Hello</ejb-name> <jndi-name>HelloEJB</jndi-name> </session> </enterprise-beans> </jboss> <<6>>
编译3个.java文件后按照以下路径存放文件(假设放到d:\sessionEjb下面) d:\sessionEjb\Hello.class d:\sessionEjb\HelloBean.class d:\sessionEjb\HelloHome.class d:\sessionEjb\META-INF\ejb-jar.xml d:\sessionEjb\META-INF\jboss.xml
然后打包d:\sessionEjb\jar cvf helloejb.jar *.*,打包后将helloejb.jar放到deploy目录下面,按参考文章的说法,控制台应该出现: 11:35:30,815 INFO [EjbModule] Creating 11:35:30,825 INFO [EjbModule] Deploying Hello 11:35:30,835 INFO [StatelessSessionContainer] Creating 11:35:30,835 INFO [StatelessSessionInstancePool] Creating 11:35:30,835 INFO [StatelessSessionInstancePool] Created 11:35:30,845 INFO [StatelessSessionContainer] Created 11:35:30,845 INFO [EjbModule] Created 11:35:30,845 INFO [EjbModule] Starting 11:35:30,845 INFO [StatelessSessionContainer] Starting 11:35:30,905 INFO [StatelessSessionInstancePool] Starting 11:35:30,905 INFO [StatelessSessionInstancePool] Started 11:35:30,905 INFO [StatelessSessionContainer] Started 11:35:30,905 INFO [EjbModule] Started 11:35:30,905 INFO [EJBDeployer] Deployed: file:/D:/jboss-3.2.1/server/default/d eploy/helloejb.jar 11:35:30,925 INFO [MainDeployer] Deployed package: file:/D:/jboss-3.2.1/server/ default/deploy/helloejb.jar 但是我这里只是简单显示: 21:23:57,968 INFO [EjbModule] Deploying Hello 21:23:58,843 INFO [EJBDeployer] Deployed: file:/E:/j2ee/jboss- 4.0.2/server/all/deploy/helloejb.jar
然后是测试程序: import javax.naming.InitialContext; import javax.naming.Context; import javax.naming.NamingException; import javax.ejb.CreateException; import java.rmi.RemoteException; import javax.rmi.PortableRemoteObject; import java.util.Properties; import java.awt.*; import java.awt.event.*; import javax.swing.*;
public class HelloWorldClient extends JFrame implements ActionListener { public HelloWorldClient() { addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); setTitle("EJBClient"); setSize(300,200); Container contentPane = getContentPane(); area = new JTextArea(6,20); subButton = new JButton("Say hello to EJB"); subButton.setActionCommand("sya"); subButton.addActionListener(this); contentPane.add(area,"Center"); contentPane.add(subButton,"South"); } public void actionPerformed(ActionEvent e) { if ( e.getActionCommand().equals("sya") ) { ejbSays = getEJBInfo(); area.append(ejbSays + "\n"); } } public String getEJBInfo() { try { Context jndiContext = getInitialContext(); Object ref = jndiContext.lookup("HelloEJB"); HelloHome home = (HelloHome)PortableRemoteObject.narrow(ref,HelloHome.class); Hello hw= home.create(); ejbSays = hw.hello(); } catch (Exception e) { e.printStackTrace(); ejbSays = e.toString(); } catch ( Throwable t ) { t.printStackTrace(); } finally { } return ejbSays; } public static Context getInitialContext() throws Exception { Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); p.put(Context.PROVIDER_URL, "localhost:1099"); return new InitialContext; } public static void main(String[] args) { JFrame win = new HelloWorldClient(); win.pack(); win.setVisible(true); } private String ejbSays=""; private JTextField info; private JButton subButton; private JTextArea area; }
所有编译也没有任何问题,然后 将编译好的HelloWorldClient.class,HelloWorldClient$1.class,放置到d:\sessionbean目录下(如果放到别的地方,确定可以通过路径找到HelloBean,HelloHome,Hello类 弹出窗口,点击按钮就出错: javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory] ....
再补充一下,我用的是jdkee1.4,jboss4,jboss3都试过,问题相同 我也试了好多网上别的例子,没一个成功的,代码应该没问题,不知是哪个环节没考虑到 各位指点一下迷津,我都快疯了
|