Como acessar um Ejb 3.0 de uma aplicacao Client

11 respostas
adrianogf

pessoal estou com duvidas de como posso acessar um session bean(remote) de uma aplicacao client.

estou tentando acessar conforme o tutorial jee da sun mas nao estou conseguindo…segue meu codigo.

Obrigado pessoal…
Adriano

import ejb.CustomerFacadeRemote;

import javax.ejb.EJB;

/**

*
  • @author adriano
    */
    public class Test {

    @EJB
    public static CustomerFacadeRemote customer;

    public static void main(String arg[]){
    
    System.out.println(customer.getResultado());
    
    }
    

}

11 Respostas

sandokandias

to com o mesmo problema, segue meu post:

http://www.guj.com.br/posts/list/56524.java

plentz

Só completando, a anotação @EJB não funciona porque você não está em um ambiente do aplication server. Em clients com JSE, é necessário fazer o lookup.

L

Nao estou conseguindo fazer o deploy de meu arquivo build.xml.

ai vai o arquivo.

<?xml version="1.0" encoding="UTF-8"?>
<property name="project.libs" value="C:\lib" />  
 <property name="src.cliente" value="classes" />  
 <property name="deploy.dir" value="C:\jboss\server\default\deploy" />       
 <property name="src.bean" value="ejbModule">
<path id="base.path">  
     <fileset dir="${project.libs}">  
         <include name="**/*.jar" />  
     </fileset>  
 </path>  
 <target name="clean" description="Delete all generated files">  
     <delete dir="${src.cliente}" />  
 </target>  

 <target name="compile" description="Compiles the Task">  
     <mkdir dir="${src.cliente}" />  
     <javac srcdir="${src.cliente}" destdir="${src.cliente}">  
         <classpath>  
             <path refid="base.path" />  
         </classpath>  
     </javac>  
 </target>  

 <target name="deploy" description="JARs the Task" depends="compile">  
     <jar destfile="${deploy.dir}/${ant.project.name}.jar">  
         <fileset dir="${src.bean}" />  
         <fileset dir="${src.cliente}">  
             <include name="**/**/*.class" />  
         </fileset>  
     </jar>  
 </target>  

 <target name="undeploy" description="Undeploy jar from server">  
     <delete file="${deploy.dir}/${ant.project.name}.jar" />  
 </target>

O erro que da é este :
Buildfile: C:\Documents and Settings\leonardo\workspace\TesteEjb\build.xml
compile:
deploy:

BUILD FAILED
C:\Documents and Settings\leonardo\workspace\TesteEjb\build.xml:30: C:\Documents and Settings\leonardo\workspace\TesteEjb\ejbModule not found.

Total time: 516 milliseconds

L

consegui fazer o deploy da aplicaçao agora !
mas esta dando um erro, o seguinte :

javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]

at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)

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

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

at javax.naming.InitialContext.(Unknown Source)

at cliente.ClienteEjb.main(ClienteEjb.java:33)

Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory

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 com.sun.naming.internal.VersionHelper12.loadClass(Unknown Source)

 5 more
Cabazzo

Vc configurou o InitialContext assim?

Properties properties = new Properties();

properties.put(java.naming.factory.initial,org.jnp.interfaces.NamingContextFactory);

properties.put(java.naming.factory.url.pkgs,org.jboss.naming:org.jnp.interfaces);

properties.put(java.naming.provider.url,ip_do_servidor:1099);

InitialContext initialContext = new InitialContext(properties);

L

poxa cara !
detectei o erro, e porque eu nao add o javaee.jar, onde posso encontrar este jar?
estou usando o jboss 4.2.3, e ja procurei pra caramba o javaee e nao encontro !

valeu aeee…

Cabazzo

que eu saiba tem o C:\jboss-4.2.3.GA\client\jboss-j2ee.jar
Não é este não?
Mas nos meus clientes eu só uso estes:

  • jbossall-client.jar
  • jboss-ejb3x.jar
  • ejb3-persistence.jar

Já é o suficiente.

L

eu ja tentei colocar este jar que voce me falou, so que continua o mesmo erro,citado ai em cima !

Rodrigo.Lima

System.out.println(“OI EJB Caralho”);

AuHAUhAUhUAhAUhUAha, essa foi boa.

R

leoangelim:
poxa cara !
detectei o erro, e porque eu nao add o javaee.jar, onde posso encontrar este jar?
estou usando o jboss 4.2.3, e ja procurei pra caramba o javaee e nao encontro !

valeu aeee…

Coloca os seguintes jar’s que o Maracuja sugeriu para evitar o erro :
javax.naming.NoInitialContextException: Cannot instantiate class

jbossall-client.jar
jboss-aspect-jdk50-client.jar
jboss-aop-jdk50-client.jar
jboss-ejb3-client.jar

Quanto ao javaee.jar, acho que ele vem com a distribuição do Glassfish e não do JBoss.

JMan

Segue o código de um cliente que acessa um EJB 3.

public class ClienteEJB {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Context context;
		try {
			Properties properties = new Properties();
			properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
			properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces");
			properties.put("java.naming.provider.url","localhost:1099");
			
			context = new InitialContext(properties);
			System.out.println(ConverterBean.RemoteJNDIName);
			Converter beanRemote = (Converter) context
					.lookup(ConverterBean.RemoteJNDIName);
			beanRemote.test();
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
}

Os seguintes .jar devem estar no seu classpath

Essa é a maneira mais simples de acessar um EJB.

Todas essas libs se encontram sobre JBOSS_HOME\client

nesse dir existem muitas outras libs, mas neste caso somente com as 4 descritas acima já funciona.

Abaixo estão as classes do meu Bean

O bean

@Stateless
public class ConverterBean implements Converter {
	
	public static final String RemoteJNDIName =  ConverterBean.class.getSimpleName() + "/remote";
	
    private BigDecimal euroRate = new BigDecimal("184654");
    private BigDecimal yenRate = new BigDecimal("112.58");

    public BigDecimal dollarToYen(BigDecimal dollars) {
        BigDecimal result = dollars.multiply(yenRate);

        return result.setScale(2, BigDecimal.ROUND_UP);
    }

    public BigDecimal yenToEuro(BigDecimal yen) {
        BigDecimal result = yen.multiply(euroRate);

        return result.setScale(2, BigDecimal.ROUND_UP);
    }
    
    public void test(){
    	System.out.println("OI EJB Caralho");
    }
}

A interface Remota

import java.math.BigDecimal;

import javax.ejb.Remote;


@Remote
public interface Converter {
	
    public BigDecimal dollarToYen(BigDecimal dollars);

    public BigDecimal yenToEuro(BigDecimal yen);
    
    public void test();
}

Criei um arquivo build.xml para poder usar o eclipse e fazer o deploy

<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="FirstEJB3" basedir="." default="deploy">

	<property name="project.libs" value="C:\lib" />
	<property name="classes.dir" value="classes" />
	<property name="deploy.dir" value="C:\jboss\server\default\deploy" />
	<property name="src.dir" value="ejbModule">
	</property>


	<path id="base.path">
		<fileset dir="${project.libs}">
			<include name="**/*.jar" />
		</fileset>
	</path>
	<target name="clean" description="Delete all generated files">
		<delete dir="${classes.dir}" />
	</target>

	<target name="compile" description="Compiles the Task">
		<mkdir dir="${classes.dir}" />
		<javac srcdir="${src.dir}" destdir="${classes.dir}">
			<classpath>
				<path refid="base.path" />
			</classpath>
		</javac>
	</target>

	<target name="deploy" description="JARs the Task" depends="compile">
		<jar destfile="${deploy.dir}/${ant.project.name}.jar">
			<metainf dir="${src.dir}/META-INF" />
			<fileset dir="${classes.dir}">
				<include name="**/**/*.class" />
			</fileset>
		</jar>
	</target>

	<target name="undeploy" description="Undeploy jar from server">
		<delete file="${deploy.dir}/${ant.project.name}.jar" />
	</target>
</project>

no dir C:\lib tenho apenas

Funciona que é uma beleza. :smiley:

Criado 7 de abril de 2007
Ultima resposta 12 de abr. de 2007
Respostas 11
Participantes 8