GlassFish não esta Injetando o EntityManager na minha classe DAO

3 respostas
ekszuki

Bom dia pessoal,

Não consegui fazer o GlassFish injetar o EntityManager na minha classe DAO, ele so injeta no meu Managed Bean .
Essa e minha classe DAO para teste, mas ele não injeta o EntityManager e da um java.lang.NullPointerException.

package key.dao;

import bean.Licensa;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.UserTransaction;

/**
 *
 * @author ekszuki
 */
public class LicensaDAO {

   @PersistenceContext(name = "keyglobalpecPU")
   private EntityManager em;

  @Resource  
  private UserTransaction utx; 

   public EntityManager getEntityManager() {
      return em ;
   }

   public Licensa getLicensaByLicenseKey(String licenseKey) {
      Query query = em.createNamedQuery("Licensa.findByLicensekey");
      query.setParameter("licensekey", licenseKey);
      return (Licensa) query.getSingleResult();
   }
}

Já aqui ele funciona normalmente se eu chamar o método renovarChave(), mas se eu chamo o metodo teste que faz uso da classe DAO acima ele da o java.lang.NullPointerException.
l

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package key.managedbean;

import bean.Liberacao;
import bean.Licensa;
import br.com.sygnux.util.Util;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.UserTransaction;
import key.Cript.Criptografia;
import key.dao.LicensaDAO;

/**
 *
 * @author Ekszuki
 */
public class MyKeyManagerBean {

   private String theOldKey;
   private String theNewKey;
   private int Dias;

   @PersistenceContext(name = "keyglobalpecPU" )
   private EntityManager em;

   @Resource
   private UserTransaction utx;

   private FacesContext context ;
   // private LicensaJpaController licensaController ;

   public MyKeyManagerBean() {
      context = FacesContext.getCurrentInstance() ;
   }

   public String getTheNewKey() {
      return theNewKey;
   }

   public String getTheOldKey() {
      return theOldKey;
   }

   public void setTheOldKey(String theOldKey) {
      this.theOldKey = theOldKey;
   }

   public int getDias() {
      return Dias;
   }

   public void setDias(int Dias) {
      this.Dias = Dias;
   }
   /** Creates a new instance of MyKeyManagerBean */
   public String renovarChave() {
      Criptografia crip = new Criptografia();
      DateFormat df = DateFormat.getDateInstance();
      Licensa licensa = null;
      Query query = null;

      try {

         // verifica se esta liberado para gerar chaves
         utx.begin() ;
         query = em.createNamedQuery("Liberacao.findAll");
         Liberacao liberacao = (Liberacao) query.getSingleResult();

         if (liberacao.getStatus().equals("N")) {
           throw new Throwable("O Sistema está bloqueado para atualizar as chaves");
         }

         // find old key in database
         query = em.createNamedQuery("Licensa.findByLicensekey");
         query.setParameter("licensekey", theOldKey);
         licensa = (Licensa) query.getSingleResult();

         // verifica se a licensa informada esta cancelada
         if (licensa.getStatus().equals("R") ) {
            throw new Throwable("Licensa informada ja foi renovada");
         }

         Date hoje = new Date();

         // verifica se a chave esta vencida
         int diasParaTravar = Util.dataDiff(hoje, licensa.getDataTrava());

         // Permiti gerar a nova chave a partir de 10 dias para vencer 
         if (diasParaTravar > 10) {
            throw new Throwable("Chave esta dentro do periodo de validade");
         }
         String key = crip.Desencripta(theOldKey);

         String hd = key.substring(10, 18);
         Date data = df.parse(key.substring(0, 10));

         Calendar dataProximaTrava = Calendar.getInstance();
         dataProximaTrava.setTime(data);
         dataProximaTrava.add(Calendar.DATE, Dias);

         theNewKey = crip.Encripta(df.format(dataProximaTrava.getTime()) + hd);

         // passa a licensa informada para cancelada
         licensa.setStatus("R") ;

         em.persist(licensa) ;

         //licensaController.edit(licensa) ;

         // registra nova licensa e seus dados
         Licensa novaLicensa = new Licensa() ;
         novaLicensa.setDataGeracao(hoje);
         novaLicensa.setDataTrava(dataProximaTrava.getTime());
         novaLicensa.setHdkey(hd);
         novaLicensa.setLicensekey(theNewKey) ;
         novaLicensa.setCliente( licensa.getCliente() ) ;
         novaLicensa.setStatus("A") ;

         em.persist(novaLicensa);

         utx.commit();

      } catch (ParseException ex) {
         Logger.getLogger(MyKeyManagerBean.class.getName()).log(Level.SEVERE, null, ex);
      } catch ( Throwable ex ) {
         FacesContext.getCurrentInstance().addMessage("invalido", new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), "Detail") );
      }
      return "refresh";
   }


   public String teste() {

      Licensa lic ;
      LicensaDAO DAO = new LicensaDAO() ;

      try {
         lic = DAO.getLicensaByLicenseKey( theOldKey ) ;

         System.out.println("Vindos do DAO: " + lic.getLicensekey() ) ;

      } catch( Exception e ) {
         e.printStackTrace();
      }



      return "refresh" ;
   }

}

Alguem poderia me dizer o porque isso acontece ?

Será que o GlassFish so faz injeção em um Managed Bean ?

Att,

3 Respostas

cristiano.andrade

ekszuki,

Você só consegue injetar o EntityManager em objetos gerenciados pelo container, sua classe DAO não é.

Para fazer a injeção sua classe teria que ser um EJB.

[]s

ekszuki

Blz, Cristiano

Entedi, mas pq ele injeta no Managed Bean ? Ele tambem não é um EJB,
a unica diferença entre as 2 classes é que uma esta descrita no faces-config.xml, por isso ela esta sendo gerenciada pelo container.

Qual seria a melhor solução entao ?

Não usar o DAO ?

ou

Criar uma classe +/- assim ?

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package key.dao;

import bean.Licensa;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;

/**
 *
 * @author ekszuki
 */
public class LicensaDAO {
   private EntityManager em;
   private UserTransaction utx;

   public LicensaDAO() {
   }

   public EntityManager getEntityManager() {
      return em;
   }

   public void setEntityManager(EntityManager em) {
      this.em = em;
   }

   public Licensa getLicensaByLicenseKey(String licenseKey) {
      try {
         Query query = em.createNamedQuery("Licensa.findByLicensekey");
         query.setParameter("licensekey", licenseKey);
         return (Licensa) query.getSingleResult();

      } catch (Exception e) {
         e.printStackTrace();
         return null ;
      }
   }

   public void salvar ( Licensa licensa ) {
      try {
         utx.begin();
         em.persist(licensa);
         utx.commit();
      } catch (RollbackException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      } catch (HeuristicMixedException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      } catch (HeuristicRollbackException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      } catch (SecurityException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      } catch (IllegalStateException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      } catch (NotSupportedException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      } catch (SystemException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
   }

      public void atualizar ( Licensa licensa ) {
      try {
         utx.begin();
         em.merge(licensa);
         utx.commit();
      } catch (RollbackException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      } catch (HeuristicMixedException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      } catch (HeuristicRollbackException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      } catch (SecurityException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      } catch (IllegalStateException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      } catch (NotSupportedException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      } catch (SystemException ex) {
         Logger.getLogger(LicensaDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
   }

   public LicensaDAO(EntityManager em, UserTransaction utx) {
      this.em = em;
      this.utx = utx;
   }
}

Ou teria como transformar essa classe em uma classe gerenciada pelo container tambem ?

Att,

cristiano.andrade

O managed bean não é um EJB, mas é um objeto gerenciado pelo container…

No seu caso vc poderia fazer um SessionBean e injetar ele no managed bean com a anotação @EJB.

Exemplo:

@Stateless // aqui vc define o seu SessionBean
public class Gerenciador implements GerenciadorLocal {

    @PersistenceContext
    private EntityManager em;

    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }

    public void salvar(Object obj)  {
      //aqui vc salva o objet usando o EM
    }
//e colocaar outros metodos atualizar remover etc..
 }

// interface local
@Local
public class GerenciadorBase implements GerenciadorBaseLocal {
    public void salvar(Object obj);
 }

E no seu managed bean vc injeta ele:

public class TesteMB{
@EJB
private GerenciadorLocal gerenciador;

 public TesteMB(){
}

public void salvarObjeto(){
 gerenciador.salvar(obj);
}
}

Para entender melhor isso vc precisa entender um pouco de EJB. Da uma pesquisada a respeito e tente implementar assim.

[]s

Criado 19 de maio de 2009
Ultima resposta 19 de mai. de 2009
Respostas 3
Participantes 2