[RESOLVIDO] JBoss AS 7 + EJB 3.1 + lookup remoto = javax.naming.NameNotFoundException

Estou fazendo uns testes com lookup Remoto via JNDI no JBoss AS 7, mas não está dando certo, e também não sei onde está o problema.
Criei uma interface para um EJB bem simples, utilizando a anotação @Remote no módulo do cliente, que vai junto com o módulo do EJB dentro da aplicação EAR.
Quando levando o servidor, aparecem os seguintes JNDI’s:

	java:global/hello-ear/hello-ejb/HelloBean!com.hello.HelloBeanRemote
	java:app/hello-ejb/HelloBean!com.hello.HelloBeanRemote
	java:module/HelloBean!com.hello.HelloBeanRemote
	java:jboss/exported/hello-ear/hello-ejb/HelloBean!com.hello.HelloBeanRemote
	java:global/hello-ear/hello-ejb/HelloBean
	java:app/hello-ejb/HelloBean
	java:module/HelloBean

Até então parece que meu bean está carregando corretamente, tanto que consigo acessá-lo normalmente via aplicação web dentro do AS. Mas quando chamo ele através de uma aplicação de teste JavaSE, recebo uma exceção javax.naming.NameNotFoundException.

O código da minha aplicação cliente:

public static void main(String[] args) {
		Properties props = new Properties();
		props.put(Context.SECURITY_PRINCIPAL, "client");
		props.put(Context.SECURITY_CREDENTIALS, "abc123");
		try {
			Context context = new InitialContext(props);
			HelloBeanRemote helloBean = 
					(HelloBeanRemote)context.lookup("java:global/hello-ear/hello-ejb/HelloBean!com.hello.HelloBeanRemote");
			JOptionPane.showMessageDialog(null, helloBean.sayHello());
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}

Meu StackTrace (só dá essa exceção mesmo):

javax.naming.NameNotFoundException: global/hello-ear/hello-ejb/HelloBean!com.hello.HelloBeanRemote -- service jboss.naming.context.java.jboss.exported.global.hello-ear.hello-ejb."HelloBean!com.hello.HelloBeanRemote"
	at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:97)
	at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178)
	at org.jboss.naming.remote.protocol.v1.Protocol$1.handleServerMessage(Protocol.java:127)
	at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever$1.run(RemoteNamingServerV1.java:73)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)

Alguém sabe dizer o que pode estar acontecendo?
Rodei pelos fóruns da JBoss e vi muita gente com problemas parecidos mas nenhuma solução…

completando, meu arquivojndi.properties:

java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
java.naming.provider.url=remote://192.168.0.100:4447

A princípio, a conexão remota está ok, pois se eu mudo a senha dá erro de autenticação. Ele não está mesmo achando o meu bean…

Ola amigo,

Tenta anotar seu ejb (BEAN) como “@Stateless(mappedName = “NOME_DO_BEAN”)” e a interface como @Remote
depois faz “context.lookup(“NOME_DO_BEAN”);”

Abraço

Cara, tentei isso, mas dá o mesmo erro.
Aliás, tentei todos os JNDI’s que aparecem no log do JBoss AS7, e nenhum funcionou.
Estou quase convencido de que isso é bug do JBoss AS7.

[quote=tectuba]Ola amigo,

Tenta anotar seu ejb (BEAN) como “@Stateless(mappedName = “NOME_DO_BEAN”)” e a interface como @Remote
depois faz “context.lookup(“NOME_DO_BEAN”);”

Abraço[/quote]

Ola amigo,

Pior que o que uso aqui é o Jboss 6, mas tive problemas parecidos e eram questões de dependencia no meu cliente, por não estar dentro do container.

Mas ele consegue se conectar, autentica e tudo. Inclusive aparece no log a conexão bem sucedida. Só não consegue fazer o lookup…

[quote=tectuba]Ola amigo,

Pior que o que uso aqui é o Jboss 6, mas tive problemas parecidos e eram questões de dependencia no meu cliente, por não estar dentro do container.[/quote]

Consegui!
O lookup correto é:

ejb:hello-ear/hello-ejb/HelloBean!com.hello.HelloBeanRemote

Fonte: documentação do JBoss AS 7: https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+client+using+JNDI

Tive ainda que incluir a linha abaixo no jndi.properties, que não estava mencionada na documentação (achei nos comentários da página)

jboss.naming.client.ejb.context=true

Ola,

O problema de realizar um lookup jndi completo é que dificulta a criação de uma fixture para fazer isso, você tera que tratar varios parametros desnecessarios. Nomeando o seu EJB
você não precisa passar o endereço completo, somente o nome e o mesmo ja é resolvido.

Valeu pela dica, mas acabei descobrindo que o JBoss AS 7 ainda não tem suporte para isso, e por isso também não funcionou. Por enquanto, só através do nome completo do bean.