Erro em aplicativo usando EJB3

27 respostas
S

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!!!

27 Respostas

C

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

S

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.

S

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)???

C

Então na sua classe UsuarioServiceBean coloque:

@Stateless(mappedName = "UsuarioServiceBean/remote")

E no nome do jndi coloque esse mappedName.

S

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!!!

C

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.

S

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!!!

C

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

Instalou o JBoss na opção EJB3?

S

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…

C

Mas achou o EJB?

S

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

C

Precisando é só postar! :joia:

S

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 ???

C

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

S

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…

C

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
S

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???

C

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.

S

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???

C

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 {

   @EJB
   private Usuario usuario;
   
   //Override
   public String getUserName() throws RemoteException {
      return usuario.getName();
   }
}
S

Certo mais como o EJB UsuarioServiceBean vai saber qual a instancia do Objeto Usuario ele vai estar referenciando quano o meu cliente executar o metodo getUserName???

Não ficou claro para mim… Deve ser pq eu tambêm não conheco o spring, já que ele tambêm usa a injeção de dependencia…

retirado desse tutorial

http://docs.jboss.org/ejb3/app-server/tutorial/injection/injection.html

E muito obrigado Carneiro… você está ajudando de montão…

[/quote]

C

Nesse caso irá ser injetado uma instância de CalculatorBean.

Mas se você fizer:

@EJB
SeuObjeto

O servidor irá ficar encarregado de injetar uma instância de SeuObjeto.

É como se fosse isso:

SeuObjeto seuObjeto = new SeuObjeto();

Mas fazendo isso você estaria criando um forte acoplamento entre essas classes.

S

Ainda não ficou claro para mim qual instancia será carregada pelo servidor!!!

como o servidor vai ficar sabendo qual a instancia do MeuObjeto ele deve usar???

C

Leia a página 205 do ebook grátis Mastering Enterprise JavaBeans, no fórum de Ferramentas e Livros tem o link para baixar o livro.

S

Demora tanto assim para receber o e-mail de validação do site para baixar o ebook? ou eu fiz coisa errada???

C

Demora só um pouco, é quase que instantâneo, espera só mais um pouquinho. :wink:

S

Pelo que estou vendo, nos exemplos e na documentação, oque eu quero fazer não e tão simples assim…

Bem eu tenho um aplicativo java rodando J2SE puro, só que o aplicativo roda em 2 maquinas distintas.

O processamento só pode se feito em um das maquinas, e se por algum motivo a maquina que estiver processando desligar ou o aplicativo parar, a outra maquina vai ter que assumir.

Então pensei em usar ejb, mas ta osso. Não da para usar injeção de dependencia com as classes beans. Pois a instancia desses classes não estão ligadas ao servidor de aplicação. Para usar ejbs teria que mudar o meu sistema um pouco…

Usando apenas rmi eu fiz um prototipo que tinha dado certo, porem quando eu starto o JBOSS, o rmi não funciona mais.

Eu achei que com ejb eu poderia dar um new MeuEjb(MeuObjeto objeto). como se eu estivesse estive chamando uma classe de dentro da minha VM.

Criado 18 de junho de 2007
Ultima resposta 25 de jun. de 2007
Respostas 27
Participantes 2