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
_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to