[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