Recuperando um DAO

4 respostas
Jedi_FeniX

Como eu faço para recuperar um DAO? O glassfish não teria que fazer a injection? Estou recebendo o seguinte erro:

INFO: java.lang.Throwable: java.lang.NullPointerException
        at gateway.dao.QueueDAO.getPackages(QueueDAO.java:56)
        at gateway.test.ee.dao.TestQueueDAO.processRequest(TestQueueDAO.java:41)
        at gateway.test.ee.dao.TestQueueDAO.doGet(TestQueueDAO.java:75)

No spring eu pego esta classe através do context, para que o spring faça as injections, como seria no glassfish?

4 Respostas

Jedi_FeniX
Esqueci de colocar a DAO:
public class QueueDAO {

    private String token;
    
    @PersistenceContext( name = "jdbc/gateway" )
    private EntityManager entityManager;
    
    private final static Logger LOGGER = Logger.getLogger( QueueDAO.class );

    public QueueDAO() {
    }

    public EntityManager getEntityManager() {
        return entityManager;
    }

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

    public Collection<Package> getPackages(Long idSMS, int limit) {
        long startTime = System.currentTimeMillis();
        String query = "select * from \"queue\".\"get_queue_to_send\"( ?, ? ) as (id_queue bigint,id_application integer," +
                "msisdn varchar,message varchar,more_info varchar,la varchar,type_server varchar,\"class\" varchar," +
                "ip varchar,port integer,\"path\" varchar,weight integer);";
        Collection<Package> packages = null;
        try {
            packages = this.getEntityManager().createNativeQuery( query )
                    .setParameter( 1, idSMS )
                    .setParameter( 2, limit )
                    .getResultList();
        } catch(Exception e) {
            LOGGER.error( this.token, new Throwable( e ) );
        }
        return packages;
    }

}
A minha classe que está instanciando o DAO é um servlet, abaixo segue um método que a servlet possui:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {

            QueueDAO dao = new QueueDAO();
            try {
                Collection<Package> packages = dao.getPackages( 5L, 100 );
                for (Package pkg : packages) {
                    out.println( pkg.getCustomer().getMsisdn() );
                }
            } catch(Exception e) {
                e.printStackTrace();
            }
        } finally { 
            out.close();
        }
    }
leosouzabh

Para que você tenha este tipo de injeção vc teria que estar trabalhando com EJB, ou seja, seu dao teria que ser um ejb para que ao criar o DAO ele injete o que for necessario, neste caso seu DAO eh um simples POJO, vc pode embutir o spring no glassfish normal ou entao criar um componente EJB.

Jedi_FeniX

Eu já trabalho com o Spring e agora fiquei em dúvida, colocar o spring para gerenciar as DAOs? OU deixar o glassfish gerenciar as DAOs? E como eu criaria este EJB?

Jair_Rillo_Junior

Pelo jeito sua aplicação não necessita de EJB (pois você mesmo disse que não use ele), portanto, aconselho você deixar o Spring injetar o DAO. Já que está usando o Spring, deixe ele fazer o controle das transações também…

Caso você estivesse usando EJB, ai sim você poderia usar o container para fazer essas injeções (através da anotação @EJB) e o controle de transação (anotações: @REQUIRED, @REQUIRED_NEW, etc etc etc).

Se quiser entrar no mundo EJB, aconselho estudar a nova versão, EJB 3.1. Nela é possível usar o EJB Light, ou seja, componentes EJB rodando dentro de aplicações web (WAR).

Criado 1 de fevereiro de 2010
Ultima resposta 2 de fev. de 2010
Respostas 4
Participantes 3