EJB3 + JBoss 4.2

Boa noite pessoal…

Estou utilizando o jboss-4.2.0.GA e estou fazendo alguns exemplos de EJB 3.0. O objetivo do exemplo e publicar um Serviço no JBoss e recuperá-lo através da JNDI.

Já fiz alguns exemplos do livro, porém não funcionou, então fiz um exemplo que está disponível na página do JBoss (http://docs.jboss.org/ejb3/app-server/tutorial/stateless/stateless.html), porém também dá erro.

As classes Calculator, CalculatorBean, CalculatorLocal, CalculatorRemote são empacotadas e publicadas no diretório /deploy, então o serviço é disparado, conforme log do jboss descrito abaixo:

01:24:45,593 INFO [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.stateless.StatelessContainer
01:24:45,609 INFO [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=jboss-test.jar,name=CalculatorBean,service=EJB3 with dependencies:
01:24:46,000 INFO [EJBContainer] STARTED EJB: org.jboss.tutorial.stateless.bean.CalculatorBean ejbName: CalculatorBean
01:24:46,171 INFO [EJB3Deployer] Deployed: file:/C:/java/jboss-4.2.0.GA/server/testes/deploy/jboss-test.jar

Porém quando vou recupará-lo através da JNDI, ocorre o seguinte erro…

javax.naming.CommunicationException [Root exception is java.lang.ClassNotFoundException: org.jboss.tutorial.stateless.bean.CalculatorRemote (no security manager: RMI class loader disabled)]

at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:713)

at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)

at javax.naming.InitialContext.lookup(Unknown Source)

at com.titan.clients.Client.main(Client.java:19)

Caused by: java.lang.ClassNotFoundException: org.jboss.tutorial.stateless.bean.CalculatorRemote (no security manager: RMI class loader disabled)

at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)

at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)

at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source)

at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source)

at java.io.ObjectInputStream.readProxyDesc(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.readObject(Unknown Source)

at java.rmi.MarshalledObject.get(Unknown Source)

at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:57)

at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:637)

… 3 more

Alguém tem alguma ideia do que eu esqueci de configurar…

Obrigado

Vc importou a interface org.jboss.tutorial.stateless.bean.CalculatorRemote no seu cliente?! aquele que da lookup?!

Se quizer um exemplo bem simples de EJB3 com annotation:

Interface

import javax.ejb.Local;
import javax.ejb.Remote;

@Remote
@Local
public interface Teste {
	void teste();
}

Implementação

import javax.ejb.Stateless;

@Stateless(name = "meuEjb")
public class TesteImpl implements Teste {
	public void teste() {
		System.out.println("teste");
	}
}

Build.xml do ant para fazer deploy

<project name="EJB" basedir="." default="deploy">
	<property file="build.properties" />

	<path id="lib.path">
		<fileset dir="${lib.dir}">
			<include name="**/*.jar" />
		</fileset>
	</path>

	<target name="clean">
		<delete dir="${bin.dir}" />
		<delete dir="${dist.dir}" />
		<mkdir dir="${bin.dir}" />
		<mkdir dir="${dist.dir}" />
	</target>

	<target name="compile" depends="clean">
		<javac srcdir="${src.dir}" destdir="${bin.dir}" debug="on">
			<compilerarg value="-Xlint:unchecked" />
			<classpath>
				<path refid="lib.path" />
			</classpath>
			<include name="**/*.java" />
		</javac>
	</target>

	<target name="build.jar" depends="compile">
		<jar destfile="${dist.dir}/${jar.name}.jar">
			<fileset dir="${bin.dir}">
				<include name="**/*.class" />
			</fileset>
		</jar>
	</target>

	<target name="deploy" depends="build.jar">
		<copy file="${dist.dir}/${jar.name}.jar" todir="${deploy.dir}" />
	</target>
</project>

arquivo properties do build (esse vc tem que alterar)

src.dir=core/src
bin.dir=core/bin
dist.dir=dist
lib.dir=lib
jar.name=teste

#Diretório base do container
container.path=/home/lroos/jboss-4.0.5.GA

#Diretório onde será feito o deploy da aplicação
deploy.dir=${container.path}/server/default/deploy

Eu coloco o código dentro de core/src, vc muda para onde estiver seus fontes, e muda tb o container.path indicando o diretório do seu jboss.

Para testar:

		Properties p = new Properties();
		p.setProperty(Context.INITIAL_CONTEXT_FACTORY,
				"org.jnp.interfaces.NamingContextFactory");
		p.setProperty(Context.PROVIDER_URL, "127.0.0.1:1099");
		p.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming");
		
		InitialContext ic = new InitialContext(p);
		Teste t = (Teste) ic.lookup("meuEjb/remote");
		t.teste();

Detalhe que o cliente que executa esse teste precisa ter a interface Teste, para isso vc pode criar um jar com a interface e executar o cliente com ela no classpath.