Problemas ao fazer lookaps com ejb3

8 respostas
S

Beleza galera?
Estou fazendo um exemplo de ejb3 mas estou tendo problemas ao fazer lookups no meu session bean.
O erro é:

javax.naming.NameNotFoundException: CalculatorBean 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 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 sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
	at sun.rmi.transport.Transport$1.run(Transport.java:159)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
	at java.lang.Thread.run(Thread.java:619)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
	at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
	at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:589)
	at javax.naming.InitialContext.lookup(InitialContext.java:392)
	at cliente.CalculadoraClient.main(CalculadoraClient.java:20)

Meinha interface remota:

package interfaces;

import javax.ejb.Remote;

@Remote
public interface Calculadora {
	public static final String JNDI_NAME = "CalculatorBean";
	long fatorial(int n);
}

Meu bean

package bean;

import interfaces.Calculadora;

import javax.ejb.Stateless;

@Stateless(mappedName="CalculatorBean")
public class CalculadoraBean implements Calculadora {

	public long fatorial(int n) {
		if (n < 0) throw new IllegalArgumentException();
		return n == 0 ? 1 : n * fatorial(n - 1);
	}

}

Estou usando java 6 e o jboss 4.2. Obrigado!

8 Respostas

Insonia

Pela especificação, a anotação @javax.ejb.Stateless possui o atributo name, que informa o nome do EJB.

Acredito que o correto seria utilizar assim:

@Stateless(name="CalculatorBean")
Abdon

Por defaul, o bind do ejb é feito da seguinte forma:

NOME_DO_EAR/NOME_BEAN_CONCRETO/REMOTE
S

E ai galera beleza?
REalmente as dicas funcionaram.
fiz como o Insônia falou mas também tive que informar o nome do ear onde se encontra o ejb statlees.
Existe uma forma de não precisar saber o nome do ear? e se hnão ouver ear e os ejbs estiverem sozinhos em um jar no servidor?

Obrigado!

Abdon

Ola,

Se não tiver um ear e somente um jar so servidor vc apenas corta esta:

NOME_BEAN_CONCRETO/REMOTE

sem passar a informação sobre o ear.

T

só por curiosidade qual Application Server tu tá usando?

S

E ai, beleza?
Na verdade só tenhbo um ear e, se eu tirar o nome do ear não funciona mesmo.
Esou usando o jboss 4.2 mas, faz isso não faz diferença
Obrigado!

S

Beleza galera!
Consegui resolver o problema!
Existe 2 anotations

@RemoteBinding(jndiBinding="CalculadoraRemote")
@LocalBinding(jndiBinding="Calculadoralocal")

Com esses anottations eu consigo injetar um nome de binding para o meu ejb, ai o meu cliente pode acessar os meus ejbs com os nomes definidos nesses anotations.
O único problema é quando se define o mesmo nome para o local e para o remoto, neste caso deve se colocar após o nome do ejb o /remote ou o /local:

@RemoteBinding(jndiBinding="Calculadora/remote")
@LocalBinding(jndiBinding="Calculadora/local")

E o cliente deve acessar com o nome do ejb com o /local ou remoto:

Calculadora calculadora = (Calculadora) ctx.lookup("Calculadora/remote");

Agora só falta eu aprender timer bean
Valeu pela ajuda gelera!

D

Existe alguma configuração que você faça em algum XML? O EJB só pode ficar em um EAR ou no JAR é?

Criado 18 de novembro de 2007
Ultima resposta 8 de set. de 2008
Respostas 8
Participantes 5