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