Link to home
Start Free TrialLog in
Avatar of rdy1437
rdy1437

asked on

problems with testing an ejb apps in eclipse ide?

Hi! I tried to do a simple application in ejb.Its a stateless session bean that just print a hello message.
Im using the sun one application server and i deployed my ejb apps using the deploytool.Im using the
eclipse ide.

I write a test application:

                  Context initContext = new javax.naming.InitialContext();
                  String JNDIName = "java:comp/env/ejb/HelloBean";
                  System.out.println("looking");
                  Object objref = initContext.lookup(JNDIName);
                  HelloHome helloHome = (HelloHome)PortableRemoteObject.narrow(objref,
                                                                  HelloHome.class);
                  System.out.println("looked");
                  Hello hello = helloHome.create();
                  System.out.println("message   " + hello.getMessage());


and when i run it i got an error:

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



sun-ejb.jar.xml
?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 8.0 EJB 2.1//EN" "http://www.sun.com/software/sunone/appserver/dtds/sun-ejb-jar_2_1-0.dtd">
<sun-ejb-jar>
  <enterprise-beans>
    <unique-id>1300025963</unique-id>
    <ejb>
      <ejb-name>HelloBean</ejb-name>
      <jndi-name>HelloBean</jndi-name>
      <pass-by-reference>false</pass-by-reference>
      <is-read-only-bean>false</is-read-only-bean>
      <refresh-period-in-seconds>-1</refresh-period-in-seconds>
      <cmt-timeout-in-seconds>0</cmt-timeout-in-seconds>
      <gen-classes>
        <remote-impl>simple.HelloBean_EJBObjectImpl</remote-impl>
        <remote-home-impl>simple.HelloBean_RemoteHomeImpl</remote-home-impl>
      </gen-classes>
      <session>
        <quick-checkpoint>true</quick-checkpoint>
      </session>
    </ejb>
  </enterprise-beans>
</sun-ejb-jar>


ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
  <display-name>Ejb1</display-name>
  <enterprise-beans>
    <session>
      <ejb-name>HelloBean</ejb-name>
      <home>simple.HelloHome</home>
      <remote>simple.Hello</remote>
      <ejb-class>simple.HelloBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Bean</transaction-type>
      <security-identity>
        <use-caller-identity/>
      </security-identity>
    </session>
  </enterprise-beans>
</ejb-jar>

Any help? thanks.


raymond

Avatar of manifoldronin
manifoldronin

Every J2EE compliant app server has a pair of vendor specific values for the two standard properties required for creating a JNDI initial context.  IIRC, for Sun ONE, it's like this:

Properties env = new Properties();
env.put("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");
env.put("java.naming.provider.url", "iiop://<your-server-name>:<port>");
InitialContext jndi = new InitialContext(env);
Avatar of Mayank S
Yup, it would be better to use the provided constants, like:

env.put ( javax.naming.Context.PROVIDER_URL, "com.sun.jndi.cosnaming.CNCtxFactory" ) ;
env.put ( javax.naming.Context.INITIAL_CONTEXT_FACTORY, "iiop://server-name:port>" ) ;

- it would be even better to store the Provider-URL in a properties-file and read from there because if you deploy on something else (like Websphere), then the name will change.
Avatar of rdy1437

ASKER

Hi!

I tried to use this :

   Properties env = new Properties();
   env.put ( javax.naming.Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory") ;
   env.put ( javax.naming.Context.PROVIDER_URL, "iiop://localhost:9090") ;
   InitialContext initContext = new InitialContext(env);


but i got this error:


javax.naming.CommunicationException: Cannot connect to ORB [Root exception is org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 208 completed: Maybe]
      at com.sun.jndi.cosnaming.CNCtx.setOrbAndRootContext(Unknown Source)
      at com.sun.jndi.cosnaming.CNCtx.initUsingIiopUrl(Unknown Source)
      at com.sun.jndi.cosnaming.CNCtx.initUsingUrl(Unknown Source)
      at com.sun.jndi.cosnaming.CNCtx.initOrbAndRootContext(Unknown Source)
      at com.sun.jndi.cosnaming.CNCtx.<init>(Unknown Source)
      at com.sun.jndi.cosnaming.CNCtxFactory.getInitialContext(Unknown Source)
      at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
      at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
      at javax.naming.InitialContext.init(Unknown Source)
      at javax.naming.InitialContext.<init>(Unknown Source)

my sun one server is running, access it thru http://localhost:9090

      
Try: env.put ( javax.naming.Context.PROVIDER_URL, "http://localhost:9090") ;
Hmm I don't think it's the same URL.  It's definitely "iiop://localhost:" + port.  I'm not very sure about which version of the Sun ONE you are running, so I don't know the port number.  Give 3700 a try because IIRC that's the default.
Avatar of rdy1437

ASKER

manifoldronin,
im using the one bundle with the j2ee1.4 installer
Avatar of rdy1437

ASKER

i  tried
 env.put ( javax.naming.Context.PROVIDER_URL, "iiop://localhost:3700") ;

but got the following exception:

javax.naming.NameNotFoundException [Root exception is org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]
Yeah, it should be "iiop://". I have never used "http:" - suggested that just in case.... because "iiop" did not seem to work. Are you sure your class-path is properly set? I mean - if you're using your own IDE, it would generally use its own classpath and not the system classpath.
ASKER CERTIFIED SOLUTION
Avatar of manifoldronin
manifoldronin

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of rdy1437

ASKER

Thanks manifoldronin!

I used the following code and it works.


Properties env = System.getProperties();
env.setProperty( javax.naming.Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory") ;
env.setProperty( javax.naming.Context.PROVIDER_URL, "iiop://purple:3700") ;*/

InitialContext context = new InitialContext();  
Object objref = context.lookup("HelloBean");
System.out.println("Looking               - " + context.getEnvironment());
System.out.println("Looking               - " + objref );