[jboss-user] [EJB 3.0] - can any one help me - having a bad day with ejb3 server and

wiggy do-not-reply at jboss.com
Sun May 27 17:52:35 EDT 2007


folks i need some help - i must be going stupid but dont know where - advice greatfully received.

I have created an EJB project for a simple hello world type stateless session bean that i publish to an 4.2 jboss container .

I use eclipse as the editor - and have two projects setup, the first for the ejb project, the second project is a standalone application that uses the embedded jboss server (from the seam distro 1.2.1.ga).

tried several scenarios and cant get the client to call the ejb successfuly.

in my EJB project i declare a bean like this 


  | package app;
  | 
  | import javax.ejb.Remote;
  | import javax.ejb.Stateless;
  | 
  | import app.client.HelloUser;
  | 
  | // (see later comments on client lookup) @Remote (HelloUser.class)
  | @Stateless
  | public class HelloUserBean implements HelloUser
  | {
  | 	HelloUserBean() 
  | 	{};
  | 	
  | 	public String sayHello (String text)
  | 	{
  | 		String msg = "hello " + text + " /n";
  | 		System.out.println(msg);
  | 		
  | 		return msg;
  | 	}
  | }
  | 

I then have an 'app.client' dir for the bean interfaces.  I have a default interface 

  | package app.client;
  | 
  | import javax.ejb.*;
  | 
  | 
  | public interface HelloUser
  | {
  | 	public String sayHello (String text);
  | }
  | 

and then extend various interfaces local, remote, WS etc from this e.g. 


  | package app.client;
  | 
  | import javax.ejb.*;
  | 
  | import app.client.HelloUser;
  | 
  | @Remote
  | public interface HelloUserRemote extends HelloUser
  | {
  | 
  | }
  | 

so far so good.  I create a jar file for all the interfaces that i make available to the second project (am i doing the right thing here.  Without it i cant make a reference to the class i want when i do a jndi lookup or try DI)

Then i start the 4.2 server and deploy the ejb project.  This goes fine.

I then have a second straight java project - this includes a /conf dir which is an exact copy of the /conf from the seam embedded dir which i include in my classpath, along with all the /lib jars from the seam /lib dir.

I then write my main client app code 


  | /**
  |  * 
  |  */
  | 	import java.util.Hashtable;
  | 
  | import javax.ejb.EJB;
  | import javax.naming.InitialContext;
  | 
  | 
  | import org.apache.log4j.Level;
  | import org.apache.log4j.Logger;
  | import org.jboss.ejb3.embedded.EJB3StandaloneBootstrap;
  | 
  | import app.client.HelloUser;
  | import app.client.HelloUserRemote;
  | 
  | /**
  |  * @author Will
  |  *
  |  */
  | public class ClientApp 
  | {
  | 	@EJB
  | 	public HelloUser tstHandler;
  | 
  | 	public ClientApp () {}
  | 
  | 	public static void main(String[] args) throws Exception 
  | 	{
  | 
  | 		Logger log = Logger.getLogger(ClientApp.class);
  | 		log.setLevel(Level.DEBUG);
  | 		//log.debug("Welcome to Wills App");
  | 		
  | 		// Boot the JBoss Microcontainer with EJB3 settings, automatically
  | 		// loads ejb3-interceptors-aop.xml and embedded-jboss-beans.xml
  | 	    EJB3StandaloneBootstrap.boot(null);
  | 
  | 	    // Deploy custom stateless beans (datasource, mostly)
  | 		//EJB3StandaloneBootstrap.deployXmlResource("META-INF/NeilsApp-beans.xml");
  | 
  | 		// Deploy all EJBs found on classpath (fast, scans build directory)
  | 		// This is a relative location, matching the substring end of one
  | 		// of java.class.path locations. Print out the value of
  | 		// System.getProperty("java.class.path") to see all paths.
  | 	    EJB3StandaloneBootstrap.scanClasspath();
  | 
  | 	    InitialContext ctx = getInitialContext();
  | 
  | 	    
  | 	    // Look up the stateless TestHandler EJB
  | 		//HelloUserRemote tstHandlerLoc = (HelloUserRemote) ctx.lookup("HelloUserBean/remote");
  | 		// Call the stateless EJB
  | 		//String message = tstHandlerLoc.sayHello("hello Will");
  | 		
  | 	    //try dependency injection!
  | 		String message = new ClientApp().tstHandler.sayHello("hello William");
  | 		
  | 	    
  | 
  | 		
  | 		//Shut down EJB container
  | 		EJB3StandaloneBootstrap.shutdown();
  | 
  | 	}
  | 	
  | 	public static InitialContext getInitialContext() throws Exception
  | 	{
  | 	   Hashtable props = getInitialContextProperties();
  | 	   return new InitialContext(props);
  | 	}
  | 
  | 	private static Hashtable getInitialContextProperties()
  | 	{
  | 	   Hashtable props = new Hashtable();
  | 	   props.put("java.naming.factory.initial", "org.jnp.interfaces.LocalOnlyContextFactory");
  | 	   props.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
  | 	   return props;
  | 	}
  | }
  | 

as i am not using a Data Source at present so I comment out the
anonymous wrote : 
  | 	    // Deploy custom stateless beans (datasource, mostly)
  | 		//EJB3StandaloneBootstrap.deployXmlResource("META-INF/NeilsApp-beans.xml");
  | 

section, and have not defined a persistence.xml file for the container yet.


If i run it like this - the Dependency Injection doesnt work and i get a null pointer exception when i hit  the 


anonymous wrote : 
  | String message = new ClientApp().tstHandler.sayHello("hello William");
  | 

If i comment this out and use a JNDI lookup call   instead

anonymous wrote : 
  | 	    // Look up the stateless TestHandler EJB
  | 		HelloUserRemote tstHandlerLoc = (HelloUserRemote) ctx.lookup("HelloUserBean/remote");
  | 		// Call the stateless EJB
  | 		String message = tstHandlerLoc.sayHello("hello Will");
  | 

then i get the following error 

anonymous wrote : 
  | 22:39:24,727 INFO  [EJBContainer] STARTED EJB: app.HelloUserBean ejbName: HelloUserBean
  | Exception in thread "main" javax.naming.NameNotFoundException: remote not bound
  | 	at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)
  | 	at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)
  | 	at org.jnp.server.NamingServer.getObject(NamingServer.java:543)
  | 	at org.jnp.server.NamingServer.lookup(NamingServer.java:296)
  | 	at org.jnp.server.NamingServer.lookup(NamingServer.java:270)
  | 	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:626)
  | 	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:588)
  | 	at javax.naming.InitialContext.lookup(Unknown Source)
  | 	at ClientApp.main(ClientApp.java:52)
  | 

if however - I uncomment the line in the HelloUserBean and set the @Remote(HelloUser.class), and then proceed to do the lookup in the client app as follows (note i have dropped the HelloUserRemote now)

anonymous wrote : 
  | 	    // Look up the stateless TestHandler EJB - dont use base interface def, and @Remote in defining bean class
  | 		HelloUser tstHandlerLoc = (HelloUser) ctx.lookup("HelloUserBean/remote");
  | 		// Call the stateless EJB
  | 		String message = tstHandlerLoc.sayHello("hello Will");
  | 

then i seems to work.


I dont understand why I cant get this to work.  

first off i presume i should use remote as the 4.2 ejb server and the embedded server are running in different VM's (under my single eclipse edit session)

second - whether its DI or jndi lookup - why cant i find/map the remote interface properly and make the client call?

any help explaining this to a simpleton would be appreciated.

regards Wiggy 





View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4048941#4048941

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4048941



More information about the jboss-user mailing list