• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2193
  • Last Modified:

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

0
rdy1437
Asked:
rdy1437
  • 4
  • 3
  • 3
1 Solution
 
manifoldroninCommented:
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);
0
 
Mayank SAssociate Director - Product EngineeringCommented:
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.
0
 
rdy1437Author Commented:
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

      
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
Mayank SAssociate Director - Product EngineeringCommented:
Try: env.put ( javax.naming.Context.PROVIDER_URL, "http://localhost:9090") ;
0
 
manifoldroninCommented:
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.
0
 
rdy1437Author Commented:
manifoldronin,
im using the one bundle with the j2ee1.4 installer
0
 
rdy1437Author Commented:
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]
0
 
Mayank SAssociate Director - Product EngineeringCommented:
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.
0
 
manifoldroninCommented:
I think you have got the right URL.  Ironically, though, telling from the new exception you got and this link below, to get an InitialContext through IIOP, you probably have to do it in a different way.  8-)

http://forum.java.sun.com/thread.jsp?forum=51&thread=497115&tstart=0&trange=15
(The last post gives an answer)
0
 
rdy1437Author Commented:
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 );
0

Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

  • 4
  • 3
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now