[Resolvido] Como Injetar um Dao em um Façade ( Serviço EJB )?

8 respostas
GabrielCardelli

Fala galera beleza?

Estou estudando essa parte de aplicações JEE e me veio uma duvida,

Como eu faço para injetar um Dao em um Façade(Meu Serviço)?

Eu pensei em anotar a classe Dao com @EJBs

e no meu façade fazer

@EJB
Dao dao;

Mais não funcionou, o que eu posso fazer para resolver esse problema? tenho que criar uma instância no braço?

Obrigado desde já.

8 Respostas

B

Deu algum erro? Poste aí sua stack trace, o DAO e o bean que você está tentando injetar o DAO, para o pessoal poder te ajudar…

Não…

GabrielCardelli
Dao
package net.gabrielcardelli.dao;

import javax.ejb.EJB;
import javax.ejb.EJBs;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import net.gabrielcardelli.bean.Person;

@EJBs(value = { @EJB })
public class PersonDao {
	
	@PersistenceContext
	private EntityManager entityManager;
	
	public String MailRegister(Person person){
		String message = null;
		try{
			entityManager.persist(person);
			message = "Cadastrado com Sucesso!";
		}catch(Exception e){
			message = "[Erro] " + e.getMessage();
		}finally{
			return message;
		}
	}

}

Façade

package net.gabrielcardelli.facade;

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

import net.gabrielcardelli.bean.Person;
import net.gabrielcardelli.dao.PersonDao;
import net.gabrielcardelli.local.MailServiceLocalInterface;

@Stateless
public class MailServiceFacade implements MailServiceLocalInterface {
	
	@EJB(name="PersonDao")
	private PersonDao personDao;
	
	
	public String MailRegister(Person person){
		personDao = new  PersonDao();
		return personDao.MailRegister(person);	
	}

}
No console aparece:
State: FAILED
  Reason: java.lang.RuntimeException: could not resolve global JNDI name for @EJ
B for container MailServiceFacade: reference class: net.gabrielcardelli.dao.Pers
onDao ejbLink:  not used by any EJBs

Abraço, Obrigado.

B

Gabriel, implemente uma interface local no seu DAO e o anote como um bean de sessão…

@Stateless 

//ou se preferir com 

@Statefull

Desta forma você poderá injetalo com @EJB no seu MailServiceFacade …

Abraços…

GabrielCardelli

Breno, muito obrigado pela força vou modificar tudo aqui! Agora me veio um duvida relacionada à arquitetura de um software, Fazer o Dao ser um EJB mesmo que não seja utilizado como um Serviço é uma boa prática?

Abraço , obrigado.

B

Bom Gabriel, eu costumo fazer desta forma… Geralmente faço um bean de sessão sem informações de estado que serve como um DAO, e o utilizo em outros EJBs quando necessário… Injeto o EntityManager apenas nesse bean de sessão, mas claro que existem outras formas…Tais como injetar o Entity Manager direto nos EJBs, mas sinceramente prefiro a opção 1 … Fica a critério do desenvolvedor mesmo…

Abraços…

GabrielCardelli

Valeu Breno! Muito Obrigado.

W

Implementar DAO (ou EAO, Entity Access Object como é chamado quando se utiliza esse pattern com JPA Entities) como Session Beans tem suas vantagens como a de receber automaticamente transações declarativas e um container-managed Entity Manager.

quebrado

Aguem teria um exemplo do uso de Entity Access Object, to tentando fazer e ta ficando tudo torto.
Valeus

Criado 27 de março de 2010
Ultima resposta 5 de mai. de 2010
Respostas 8
Participantes 4