pierwsze uruchomienie EJB

0

hej,
chcialam uruchomic moja 1sza app z ejb bo czas najwyzszy zaczac. W eclipse utworzylam projekt typu EJB, w nim do ejbModule dodalam ejb sesyjny i mam tam 3 klasy:

 

package test.session;
import javax.ejb.Local;

import org.jboss.ejb3.annotation.LocalBinding;

@Local
public interface TestSessionBeanLocal {
	
	void test();

}
package test.session;

import javax.ejb.Stateless;

/**
 * Session Bean implementation class TestSessionBean
 */
@Stateless
public class TestSessionBean implements TestSessionBeanLocal {

    /**
     * Default constructor. 
     */
    public TestSessionBean() {
        // TODO Auto-generated constructor stub
    }
    
    public void test(){
    	System.out.println("TEST");
    }

}
 

w eclipse dalam run on server (JBoss 5) i chyba jest run. do tej samej paczki dodalam klase test:

 
package test.session;

import javax.naming.Context;
import javax.naming.InitialContext;

public class TestClient {

	public static void main(String[] args) throws Exception{
		
		String jndiName = "TestSessionBeanLocal/local";  
		Context ic = new InitialContext();
		TestSessionBean obj = (TestSessionBean)ic.lookup(jndiName);
		obj.test();

		
	}
	
}

i dostaje err:

**Exception in thread "main" 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
**

o co chodzi?? totalnie nie kumam:/ i na prawde nie moge dojsc po googlach.

bede wdzieczna za wszystkie sugestie..

pzdr,
misty

0

zrobilam drobne zmiany i teraz mam o tak:
<code=javaimport javax.ejb.Stateless;

/**

  • Session Bean implementation class TestSessionBean
    */
    @stateless
    public class TestSessionBean implements TestSessionBeanLocal {

    public static final String LocalJNDIName = TestSessionBeanLocal.class.getSimpleName() + "/local";

    /**

    • Default constructor.
      */
      public TestSessionBean() {
      // TODO Auto-generated constructor stub
      }

    public String test(){
    return "TEST";
    }

}>

```java
package test.session;
import javax.ejb.Local;

import org.jboss.ejb3.annotation.LocalBinding;

@Local
public interface TestSessionBeanLocal {
	
	String test();

} 

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;

public class TestClient {

	public static void main(String[] args) throws Exception{
		
		Properties properties = new Properties();
		properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
		properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces");	
		properties.put("java.naming.provider.url","127.0.0.1:1099");
		
		
		Context context = new InitialContext(properties);	
	
		
		NamingEnumeration ne = context.listBindings("TestSessionBean");
		while(ne.hasMore())
		{
			System.out.println(ne.next().toString());
			
		}
	
		try		{			 
			TestSessionBean bean = (TestSessionBean)context.lookup(TestSessionBean.LocalJNDIName);
			String s = bean.test(); 		
			
			System.out.println("response "+s);
			
			} catch (NamingException e)		{		
				e.printStackTrace();			}
		
		
	}
} 

no i ten system.out w while'u wypisuje mi:

local: Proxy for: test.session.TestSessionBeanLocal:Reference Class Name: Proxy for: test.session.TestSessionBeanLocal
Type: ProxyFactoryKey
Content: ProxyFactory/TestSessionBean/TestSessionBean/local
Type: EJB Container Name
Content: jboss.j2ee:jar=TestEjb.jar,name=TestSessionBean,service=EJB3
Type: Proxy Factory is Local
Content: true
Type: Local Business Interface
Content: test.session.TestSessionBeanLocal

local-test.session.TestSessionBeanLocal: Proxy for: test.session.TestSessionBeanLocal:Reference Class Name: Proxy for: test.session.TestSessionBeanLocal
Type: ProxyFactoryKey
Content: ProxyFactory/TestSessionBean/TestSessionBean/local
Type: EJB Container Name
Content: jboss.j2ee:jar=TestEjb.jar,name=TestSessionBean,service=EJB3
Type: Proxy Factory is Local
Content: true
Type: Local Business Interface
Content: test.session.TestSessionBeanLocal
 

wiec cos tu jest. ale juz dalej mam exception i: javax.naming.NameNotFoundException: TestSessionBeanLocal not bound

nie mam pojecia czemu.. :(

0

a jak podmienie na:

TestSessionBeanLocal bean = (TestSessionBean)context.lookup("TestSessionBean");

to dostaje:
xception in thread "main" java.lang.ClassCastException: org.jnp.interfaces.NamingContext cannot be cast to test.session.TestSessionBean

on mi zwraca NamingContext.. nie kumam. tzn wiem ze tak jest w properties, ale to jest chyba jakas ogolna konfiguracja? (znalazlam na necie, na paru str to samo bylo).. jezu, jak to ogarnac?

0

a to nie jest tak, że dałaś @local, a tak naprawdę symulujesz dostanie się do tego interfejsu z zewnętrznej aplikacji klienckiej?

Może spróbuj @Remote.

A tak w ogóle na start polecam OpenEJB zamiast zabawy z Jbossem.

Na początek: http://www.jaceklaskowski.pl/wiki/EJB_3.1_z_OpenEJB_3.1_i_NetBeans_IDE_7.0

0

no wlasnie dziala mi z @Remote (aczkolwiek znalazlam ciut inny przyklad i tamten tez nie dziala mi @local).
ale nie kapuje tego. przeciez local to jak na tej samej maszynie tak, a remote to zdalne. a ja to mam wszystko u siebie lokalnie! wiec jak moze byc ze jest remote?

pzdr

0

Tak, ale Ty tu podpinasz się pod Jbossa i tak naprawdę 'udajesz' że jest to aplikacja zdalna ( bo ta aplikacja kliencka na jbossie nie musi siedzieć ).

0

nadal nie kumam. przeciez jest jedno JVM. to jak zatem moge byc locale?

pzdr

0

czy to jest tak, ze jak z tego samego projektu sie podpinam (przykladowo mam projekt A gdzie mam tego ejb + jakis source code z jakas logika co sie odwoluje do tego ejb) to wtedy jest local, a wystarczy ze mam 2 projekty (jeden to ejb lezace na jboss), druga to jakas aplikacja j2ee - to wtedy jest to remote? mimo tego ze jest to 1 maszyna i jedno JVM?

0

ale serwer ma swój kontekst, do którego się podpinasz przekazując zmienne w propertiesach dla InitialContext. Więc tak naprawdę Twoja klasa kliencka nie ma pojęcia, że jest to ta sama maszyna. A przez Remote powiedzmy wystawiasz interfejsy przez które można się komunikować z beanami.

0

hmm,
ja to troche inaczej zrozumialam. wyobrazalam sobie ze locale tak dlugo jak bede u siebie (localhost) jest to locale. w sumie czytalam to w dokumentacji i serio tak to zrozumialam. zmarnowalam ze 3h nad tym, zupelnie bez sensu..

dobra, grunt ze wiadomo juz o co chodzi!

dzieki wielkie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1