Erro em aplicativo usando EJB3

Ai galera, to querendo aprender ejb3…

Peguei um tutorial na net ele parece bom para caramba, ensina passo-a-passo como desenvolver e fazer o deploy usando o JBOSS…

Contudo quando tento rodar o meu cliente, é lançada um exception

javax.naming.NameNotFoundException: com.service.UsuarioService 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:585)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
	at sun.rmi.transport.Transport$1.run(Transport.java:153)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
	at java.lang.Thread.run(Thread.java:595)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
	at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
	at sun.rmi.server.UnicastRef.invoke(Unknown Source)
	at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:625)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
	at javax.naming.InitialContext.lookup(Unknown Source)
	at com.service.ServiceLocator.get(Unknown Source)
	at com.testes.TestUsuario.main(TestUsuario.java:9)
java.lang.NullPointerException
	at com.testes.TestUsuario.main(TestUsuario.java:10)

Abaixo segue meus codigos

package com.model.ejb.session;

import java.rmi.RemoteException;

import javax.ejb.Stateless;

import com.service.UsuarioService;

@Stateless
public class UsuarioServiceBean implements UsuarioService {

	public String getMessage() throws RemoteException {
		return "Hello World";
	}

}
package com.service;

import java.rmi.RemoteException;

import javax.ejb.Remote;

@Remote
public interface UsuarioService {
	public String getMessage() throws RemoteException;
}
package com.service;

import java.util.Hashtable;

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

public class ServiceLocator {

	private static ServiceLocator locator = null;
	private InitialContext initialContext;
	
	@SuppressWarnings("unchecked")
	private ServiceLocator() {
		try {
			Hashtable t = new Hashtable();
			t.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
			t.put(Context.PROVIDER_URL,"localhost");
			t.put(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");
			
			initialContext = new InitialContext(t);
		} catch (Exception exc) {
			exc.printStackTrace();
		}
	}
	
	public static ServiceLocator getInstance() {
		if(ServiceLocator.locator == null) {
			ServiceLocator.locator = new ServiceLocator();
		}
		return locator;
	}
	
	protected Object clone() throws CloneNotSupportedException {
		throw new CloneNotSupportedException();
	}
	
	public Object get(String jndiName) throws Exception {
		try {
			Object result = null;
			result = initialContext.lookup(jndiName);
			
			if(result == null) {
				throw new NamingException();
			}
			
			return result;
		} catch(NamingException e) {
			e.printStackTrace();
		}
		
		return null;
	}
}
package com.testes;

import com.service.ServiceLocator;
import com.service.UsuarioService;

public class TestUsuario {
	public static void main(String[] args) {
		try {
			UsuarioService usuario = (UsuarioService) ServiceLocator.getInstance().get(UsuarioService.class.getName());
			System.out.println(usuario.getMessage());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Vlw galera, abraço!!!

Coloque ejb/UsuarioService no atributo name da annotation Remote e passe esse nome na String do get(String jndi) do ServiceLocator.

Carneiro…

estava olhando a annotation remote so possui o parametros value, que seria um objeto Class…

A annotation @Stateless possui o parametro name…

A tentei da seguinte maneira…

package com.model.ejb.session;

import java.rmi.RemoteException;

import javax.ejb.Stateless;

import com.service.UsuarioService;

@Stateless(name="ejb/UsuarioService")
public class UsuarioServiceBean implements UsuarioService {

	public String getMessage() throws RemoteException {
		return "Hello World";
	}

}

e usei get(“ejb/UsuarioService”).

Mais ai deu outro erro, onde não conseguiu fazer o cast para UsuarioService.

Estranho que ele esta achando a classe que eu passo o nome no JNDI, mas não consegui fazer o cast para UsuarioService…

Fiz um teste com instanceof para ver se o Object retornado pelo get do ServiceLocator era um UsuarioService, e só me retorna false.

Será que é alguma configuração no meu JBOSS???

Ou a propria versão, (4.0.5.GA)???

Então na sua classe UsuarioServiceBean coloque:

@Stateless(mappedName = "UsuarioServiceBean/remote")

E no nome do jndi coloque esse mappedName.

Carneiro obrigado pela ajuda…
Contudo, ainda não consigui rodar… agora está lançado uma exception
NoClassDefFoundError: org;jboss/advice/Interceptor

Onde eu não tenho nenhuma ideia do que seja… hehehehe

Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/aop/advice/Interceptor
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(Unknown Source)
	at java.security.SecureClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.access$000(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
	at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
	at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
	at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
	at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readArray(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at java.rmi.MarshalledObject.get(Unknown Source)
	at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:72)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:652)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
	at javax.naming.InitialContext.lookup(Unknown Source)
	at com.service.ServiceLocator.get(Unknown Source)
	at com.testes.TestUsuario.main(Unknown Source)

To lendo a especificação do ejb3…

Se alguem tiver um outro tutorial sobre o assunto (EJB3)…

Vlw pela ajuda!!!

Tenta assim:

UsuarioService usuario = (UsuarioService) ServiceLocator.getInstance().get(UsuarioServiceBean.class.getName() + "/remote"); 

Tutorial mesmo tem o de Java EE 5 da Sun que é excelente e o livro Mastering Enterprise JavaBeans 3.0, no fórum de Ferramentas e Livros tem o link pra baixar o PDF.

Livro em português tem o Enterprise JavaBeans 3.0, procure na tempo real ou submarino.

Carneiro obrigado pela ajuda…
Contudo, ainda não consigui rodar… agora está lançado uma exception
NoClassDefFoundError: org;jboss/advice/Interceptor

Onde eu não tenho nenhuma ideia do que seja… hehehehe

Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/aop/advice/Interceptor
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(Unknown Source)
	at java.security.SecureClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.access$000(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
	at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
	at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
	at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
	at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readArray(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at java.rmi.MarshalledObject.get(Unknown Source)
	at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:72)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:652)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
	at javax.naming.InitialContext.lookup(Unknown Source)
	at com.service.ServiceLocator.get(Unknown Source)
	at com.testes.TestUsuario.main(Unknown Source)

To lendo a especificação do ejb3…

Se alguem tiver um outro tutorial sobre o assunto (EJB3)…

Vlw pela ajuda!!!

Você instalou o JBoss corretamente? Esse erro é de lib, tá faltando alguma.

Instalou o JBoss na opção EJB3?

AE funcionou!!!

Foi so eu adicionar ao meu projeto 2 jars (jboss-aop-jdk50.jar, jboss-ejb3.jar).

Fazer o deploy novamente… e pronto…

Vlw ae Carneiro pela ajuda…

Mas achou o EJB?

Funcionou sim…
Aparece “hello world” no prompt… vlw!!!

Precisando é só postar! :joia:

A pergunta pode parecer idiota…

mas se eu quisesse testar meu ejb, execuntando o cliente em outra maquina, eu deveria ter o jboss rodando nessa maquina tb??? ou apenas o rmiregistry ja resolveria o problema ???

Você precisa apenas do JBoss rodando no servidor, no cliente você pode acessar via Tomcat.

como faço para acessar o tomcat???

tava lendo sobre JNDI via HTTP na documentação… mas não entendi muita coisa… também não sei se era isso mesmo que eu devia ler…

tentei fazer alguma coisa acesando

http://192.168.1.163:8081/invoker/EJBInvokerServlet… so que não funcionou…

VLW, galera…

Você tem que criar um arquivo chamado jndi.properties e colocar:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:109

Bem, não sei e certo reviver o topico assim, mas como tem haver com EJB3, preferi usar o mesmo post…

Bem… participei de uma paletras aqui em BH sobre ejb3, e me lembro de ter ouvido falar que qq classe java pode ser um ejb na nova especificação…

isso está correto???

outra duvida e a seguinte… tem como eu passar parametros para meu ejb???

package com.model.ejb.session;

import java.rmi.RemoteException;

import javax.ejb.Stateless;

import com.service.UsuarioService;

@Stateless(mappedName="UsuarioServiceBean/remote")
public class UsuarioServiceBean implements UsuarioService {

	private String name;

        public UsuarioServiceBean(String name) {
                this.name = name;
        }

        // Implementa do metodo getMessage da interface
	public String getMessage() throws RemoteException {
		return name;
	}
}

Tem como eu fazer isso???

Aparentemente está sim, porque é só você anotar sua classe de negócio que ela se tornará um EJB.

Uma das novas funcionalidades do EJB3 é a injeção de dependências. Com ela você pode “injetar” objetos nas suas classes.

A annotations @EJB é para esse caso. Porém ela necessita de um construtor padrão, no seu caso não funcionará. Funcionaria se ao invés de você injetar via @EJB, você utiliza-se um factory que através do design pattern Service Locator disponibilizaria uma instância ou a String, no seu caso.

Carneiro então a injeção de dependencia funcionaria assim???

import java.rmi.RemoteException;

import javax.ejb.EJB;
import javax.ejb.Stateless;


import com.service.Usuario;
import com.service.UsuarioService;

@Stateless(mappedName="UsuarioServiceBean/remote")
public class UsuarioServiceBean implements UsuarioService {

	private Usuario usuario;
	
	@EJB(beanName="Usuario")
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	//Override
	public String getUserName() throws RemoteException {
		return usuario.getName();
	}
}

minha classe Usuario

public class Usuario {

	private String name;
	private String idade;

	public String getIdade() {
		return idade;
	}

	public void setIdade(String idade) {
		this.idade = idade;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

Assim estaria correto???