EJB i mappedName

0

Witam programistów! Od razu przejdę do sedna: zamierzam utworzyć prostą aplikację (EJB 3.0) w GlassFishu z wykorzystaniem bazy Oracle. Zacząłem od najprosztszej aplikacji:
Interfejs (po stronie klienta):

package session;
import javax.ejb.Remote;

@Remote
public interface EJBRemote {

	public String metoda(); 
	
}

Implementacja interfejsu (po stronie serwera):

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import domain.Test;




/**
 * Session Bean implementation class EJBRemote
 */
@Stateless(mappedName = "Teleport")

public class EJB implements EJBRemote {
@PersistenceContext EntityManager en;	
    /**
     * Default constructor. 
     */
    public EJB() {
        // TODO Auto-generated constructor stub
    }


	@Override
	public String metoda() {
		//return "dziala";
		return en.find(Test.class, new Long(1)).getNazwaTest();
		
	}

}

A tu kod klienta:

package client;

import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import session.EJBRemote;
public class Klient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		
		
		
		
		 try {
				Properties p1 = new Properties();
				p1.put("org.omg.CORBA.ORBInitialHost", "localhost");
				p1.put("org.omg.CORBA.ORBInitialPort", "3700");
				InitialContext ic = new InitialContext(p1); 	
				
				EJBRemote dao = (EJBRemote) ic.lookup("Teleport");
				String result = dao.metoda();
					        
					        
					        System.out.println(result);
					    } catch (NamingException e) {
					        e.printStackTrace();
					    }
	}

}

Błąd jest taki:

javax.naming.NameNotFoundException: Teleport not found
	at com.sun.enterprise.naming.TransientContext.doLookup(TransientContext.java:216)
	at com.sun.enterprise.naming.TransientContext.lookup(TransientContext.java:188)
	at com.sun.enterprise.naming.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:74)
	at com.sun.enterprise.naming.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:129)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
	at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
	at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)

Dopiero zaczynam zabawę z EJB...Co tu nie gra? Z góry dziękuję za wszelkie wskazówki

Dodam, że projekt robie w Eclipsie (2 oddzielne projekty - serwer i klient)

0

Sprawdź w panelu admina pod jaką nazwą zarejestrował się ten bean. IMO samo "Teleport" nie jest wystarczające. Chyba tam jest "ejb/Teleport" z tego co pamiętam.

0

A gdzie tego szukac w tym panelu Glassfisha? Myślałem, że nazwa jest dowolna, z tym ze po stronie klienta i serwera musi byc taka sama...

0

A czy zainstalowałeś EJBa w serwerze?

0

Tak, mam wszystko skonfigurowane, ale zrobiłem ptrzed chwila tak: za nazwe teleport wstawilem nazwe OracleDS - ktora utworzylem w panelu admina w zakladce Connector Resources...Odpalilem program...i teraz taki blad:

2009-12-03 00:10:18 com.sun.messaging.jms.ra.ResourceAdapter start
INFO: MQJMSRA_RA1101: SJSMQ JMS Resource Adapter starting...
2009-12-03 00:10:19 com.sun.messaging.jms.ra.ResourceAdapter start
INFO: MQJMSRA_RA1101: SJSMQ JMSRA Started:REMOTE
2009-12-03 00:10:19 com.sun.messaging.jms.ra.ManagedConnectionFactory setAddressList
INFO: MQJMSRA_MF1101: setAddressList:NOT setting default value=localhost
Exception in thread "main" java.lang.ClassCastException: com.sun.messaging.jms.ra.ConnectionFactoryAdapter cannot be cast to session.EJBRemote
	at client.Klient.main(Klient.java:26)

Nazwe "Teleport" na "OracleDS" oczywiscie zamienilem i po stronie klienta i po stronie serwera (w dwooch miejscach)...

0

Błąd jest zrozumiały. Serwer próbuje wykonać rzutowanie obiekt interfejsu EJBRemote do obiektu klasy ConnectionFactoryAdapter. To nie przejdzie.
Rzuć okiem na ten tutorial:
http://blogbysud.blogspot.com/2007/03/standalone-ejb-30-client-for-remote-ejb.html

Ze szczególnym uwzględnieniem tej linii:

OrderBean bean = (OrderBean) ctx.lookup("ejb/OrderBean");

Wykonując lookup klientem musisz podać nie tylko nazwę zasobu, ale też gdzie serwer składuje takie zasoby w tym przypadku "ejb/OrderBean". Pomyśl o tym tak jak o odwołaniu do pliku na dysku. ejby są w katalogu ejb/, źródła danych w data-sources/ itd.

0

Hmm, próbuję wszystkiego i nic...W Eclipsie utworzylem 3 projekty: EJB, EJBClient i EJBEAR...W projekcie EJB są pliki ejb-jar.xml oraz sun-ejb-jar.xml - to są deskryptory? Może one przsłaniają adnotacje? Druga sprawa to taka, że dalej nie wiem co wpisać w tym lookup:
EJBRemote dao = (EJBRemote) ic.lookup("ejb/EJBRemote");
Wciąż bład, że nie widzi/nie moze znaleźć...W panelu Glassfisha zrobiłem tylko 2 rzeczy: dodałem w zakładce Connector resources pozycję ktora nazwalem OracleDS oraz w sekcji Connector Connection Pools dodałem pozycję (nazwalem to OraclePool, Resource Adapter=jmsra, Connection Definition=javax.jms.ConnectionFactory)...cos pominalem w panelu admina?

0

Tak, ejb-jar.xml ma wyższy priorytet niż adnotacje i może je "przesłaniać".

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