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

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á.

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…

Dao

[code]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;
	}
}

}
[/code]

Façade

package net.gabrielcardelli.facade;

[code]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);	
}

}
[/code]

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.

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…

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.

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…

Valeu Breno! Muito Obrigado.

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.

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