vRaptor3

21 respostas
Nayane1

Caros colegas, estou iniciando com java e frameworks e estou começando com o vRaptor3 e já senti uma dificuldade no inicio. A apostila da caelum orienta que no contrutor do controlador eu inicialize o objeto dao, como o exemplo:

public class AlunosController {

private AlunoDao dao;
private Result result;
private Validator validator;

[b]public AlunosController(AlunoDao dao) {[/b]
  this.dao = dao;
}

Entretanto, quando faço isso dá o seguinte erro:
Error creating bean with name ‘alunosController’ defined in file [D:\Nayane\projetos\vRaptor3\build\web\WEB-INF\classes\controle\turmas\controlador\AlunosController.class]

Mas quando retiro o AlunoDao como parametro dá certo, mas não consigo salvar o aluno no banco de dados e dá o erro:
br.com.caelum.vraptor.InterceptionException: java.lang.NullPointerException, eu debuguei e ele nem entrou no “dao.save”

21 Respostas

J

Nayane,

A classe AlunoDao está anotada como “@Component”?
Só colocar essa annotation antes da declaração da classe. Pode ser isso.

Nayane1

jvicthor:
Nayane,

A classe AlunoDao está anotada como “@Component”?
Só colocar essa annotation antes da declaração da classe. Pode ser isso.

Sim Victhor, olha como está a classe AlunoDao:

package controle.turmas.dao;

import br.com.caelum.vraptor.ioc.Component;

import controle.turmas.beans.Aluno;

import java.util.ArrayList;

import java.util.List;

import org.hibernate.Session;

/**
*

  • @author nayane
    */
    @Component
    public class AlunoDao {

    private Session session;

    public AlunoDao(Session session) {
    
    this.session = session;
    
    }
    
    public void adiciona(Aluno aluno) {
    
    session.save(aluno);
    
    }
    
    public List listaTodos() {
    
    return new ArrayList();
    
    }
    
    }
    
Lucas_Cavalcanti

em qual linha tá dando esse NullPointerException?

Nayane1

/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package controle.turmas.controlador;
import controle.turmas.dao.AlunoDao;

import br.com.caelum.vraptor.Resource;

import br.com.caelum.vraptor.Result;

import br.com.caelum.vraptor.Validator;

import br.com.caelum.vraptor.validator.Validations;

import br.com.caelum.vraptor.view.Results;

import controle.turmas.beans.Aluno;

import java.util.ArrayList;

import java.util.List;

/**
*

  • @author nayane
    */
    @Resource
    public class AlunosController {

    private AlunoDao dao;
    
    private Result result;
    
    private Validator validator;
    

    public AlunosController() {

    }

    public List lista() {
    
    return new ArrayList();
    
    }
    

    public void form() {
    }

    public void adiciona( Aluno aluno) {
    
    /*
    
    validator.checking(new Validations() {
    
    {
    
    that(!aluno.getNome().isEmpty(), aluno.nome, nome.vazio);
    
    that(aluno.getNome().isEmpty(), aluno.nome, nome.vazio);
    
    that(aluno.getIdade() > 0, aluno.idade, idade.invalido);
    
    }
    
    });
    
    validator.onErrorUse(Results.page()).of(AlunosController.class).form();
    

*/
aluno.setSexo(true);
dao.adiciona(aluno); //AQUI DÁ O NullPointerException

}

}

O NullPointerException é no dao.adiciona(aluno)

G

Você precisa injetar os objetos via construtor:

private AlunoDao dao;
private Result result;
private Validator validator;

public AlunosController(AlunoDao dao, Result result, Validator validator) {
    this.dao = dao;
    this.result = result;
    this.validator = validator;
}

Essa explicação você encontra no exemplo dessa página: http://vraptor.caelum.com.br/documentacao/vraptor3-guia-de-1-minuto/

Nayane1

O problema é , já inseri os objetos. org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [org.hibernate.Session] is defined: Unsatisfied dependency of type [interface org.hibernate.Session]: expected at least 1 matching bean

G

Dê um olhada nessa página da documentação do vraptor3: http://vraptor.caelum.com.br/documentacao/componentes-utilitarios-opcionais/

Em resumo você precisa adicionar no seu web.xml uma configuração para que o vraptor possa iniciar os componentes da Session do Hibernate. Você precisa fazer isso porque ele é um componente opcional.

<context-param> <param-name>br.com.caelum.vraptor.provider</param-name> <param-value>br.com.caelum.vraptor.util.hibernate.HibernateCustomProvider</param-value> </context-param>

Nayane1

ok, adicionei o parametro e a classe, quando fui mapear minha classe Aluno deu o erro:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘hibernateTransactionInterceptor’: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.Session]: : Error creating bean with name ‘br.com.caelum.vraptor.util.hibernate.SessionCreator’: FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘sessionCreator’: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.SessionFactory]: : Error creating bean with name ‘br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator’: FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sessionFactoryCreator’: Invocation of init method failed; nested exception is org.hibernate.MappingException: Unable to load class declared as in the configuration:; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator’: FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sessionFactoryCreator’: Invocation of init method failed; nested exception is org.hibernate.MappingException: Unable to load class declared as in the configuration:; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘br.com.caelum.vraptor.util.hibernate.SessionCreator’: FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘sessionCreator’: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.SessionFactory]: : Error creating bean with name ‘br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator’: FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sessionFactoryCreator’: Invocation of init method failed; nested exception is org.hibernate.MappingException: Unable to load class declared as in the configuration:; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator’: FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sessionFactoryCreator’: Invocation of init method failed; nested exception is org.hibernate.MappingException: Unable to load class declared as in the configuration:

=(

G
<mapping class="Aluno"/>

Você deve colocar o endereço completo da classe, com o pacote. Exempo:

<mapping class="meu.pacote.Aluno"/>
Nayane1

Ok, era isso mesmo, valeu! Meu problema agora é na hora de salvar no banco. Não estou sabendo como abrir conexão…

@Component
public class AlunoDao {

private Session session;
private Database controler;
public AlunoDao(Session session){

    this.session = session;
}
public List<Aluno> listaTodos(){
    return new ArrayList<Aluno>();
}
public void adiciona(Aluno aluno){
    session.save(aluno);
}
Nayane1

Mostra o seguinte erro quando vou salvar: The specified HTTP method is not allowed for the requested resource ().

Nayane1

Adicionei a transação, mas mesmo assim dá o mesmo erro:

@Component
public class AlunoDao {

private Session session;
private Transaction tz = null;
public AlunoDao(Session session){

    this.session = session;
}
public List<Aluno> listaTodos(){
    return new ArrayList<Aluno>();
}
public void adiciona(Aluno aluno){
    tz = (Transaction) session.beginTransaction();
    session.save(aluno);
    try {
        tz.commit();
    } catch (RollbackException ex) {
        Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
    } catch (HeuristicMixedException ex) {
        Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
    } catch (HeuristicRollbackException ex) {
        Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SecurityException ex) {
        Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalStateException ex) {
        Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SystemException ex) {
        Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
    }

}
Nayane1

Esta dando esse erro no log do Tomcat:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘alunosController’ defined in file [C:\Users\nayane\Documents\NetBeansProjects\vRaptor3\build\web\WEB-INF\classes\controle\turmas\controlador\AlunosController.class]: Unsatisfied dependency expressed through constructor argument with index 1 of type [org.springframework.orm.jpa.vendor.Database]: : No unique bean of type [org.springframework.orm.jpa.vendor.Database] is defined: Unsatisfied dependency of type [class org.springframework.orm.jpa.vendor.Database]: expected at least 1 matching bean; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [org.springframework.orm.jpa.vendor.Database] is defined: Unsatisfied dependency of type [class org.springframework.orm.jpa.vendor.Database]: expected at least 1 matching bean

Eu mudei a classe AlunoDao para:

package controle.turmas.dao;

import br.com.caelum.vraptor.ioc.Component;

import controle.turmas.beans.Aluno;

import java.util.ArrayList;

import java.util.List;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.security.auth.login.Configuration;

import javax.transaction.HeuristicMixedException;

import javax.transaction.HeuristicRollbackException;

import javax.transaction.RollbackException;

import javax.transaction.SystemException;

import javax.transaction.Transaction;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.AnnotationConfiguration;

import org.springframework.orm.jpa.vendor.Database;

/**
*

  • @author nayane
    */
    @Component
    public class AlunoDao {

    private Session session;
    
    private Transaction tz = null;
    
    public AlunoDao(Session session){
    
    this.session = session;
    
    }
    
    public List listaTodos(){
    
    return new ArrayList();
    
    }
    
    public void adiciona(Aluno aluno){
    
    AnnotationConfiguration cfg = new AnnotationConfiguration();
    
    cfg.configure(hibernate.cfg.xml);
    
    SessionFactory sf = cfg.buildSessionFactory();
    
    tz = (Transaction) session.beginTransaction();
    
    session.save(aluno);
    
    try {
    
    tz.commit();
    
    } catch (RollbackException ex) {
    
    Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
    
    } catch (HeuristicMixedException ex) {
    
    Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
    
    } catch (HeuristicRollbackException ex) {
    
    Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
    
    } catch (SecurityException ex) {
    
    Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
    
    } catch (IllegalStateException ex) {
    
    Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
    
    } catch (SystemException ex) {
    
    Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
    
    }
    
    session.close();
    

    }

Se alguém puder me ajudar!!!

Lucas_Cavalcanti

nossa, calma aí…

pode voltar o seu dao pro modo mais simples:

@Component
public class AlunoDao {

   private Session session;
   public AlunoDao(Session session){
      this.session = session;
   }
   public List<Aluno> listaTodos(){
       return new ArrayList<Aluno>();
   }
   public void adiciona(Aluno aluno){
      session.save(aluno);
   }

Não use a classe Database! ela provavelmente era só um exemplo…

O seu erro está no controller:

Error creating bean with name 'alunosController' 
...
No unique bean of type [org.springframework.orm.jpa.vendor.Database] is defined

vc deve estar recebendo um Database no construtor do AlunosController… não faça isso! receba o AlunoDao no construtor do AlunosController que deve funcionar…

PS: coloque seus códigos entre [code ] e [/code ] (sem espaços dentro da tag)

Nayane1

ok, obrigada! O erro agora é outro:

br.com.caelum.vraptor.InterceptionException: java.lang.ClassCastException: org.hibernate.transaction.JDBCTransaction cannot be cast to javax.transaction.Transaction

O erro está no AlunoDao, no método adiciona

@Component
public class AlunoDao {

    private Session session;
    private Transaction tz = null;
    public AlunoDao(Session session){

        this.session = session;
    }
    public List<Aluno> listaTodos(){
        return new ArrayList<Aluno>();
    }
    
    public void adiciona(Aluno aluno){
        try {
            tz = (Transaction) session.beginTransaction();
            session.save(aluno);
            tz.commit();
            session.close();
        }
        catch (RollbackException ex) {
            Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
        } catch (HeuristicMixedException ex) {
            Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
        } catch (HeuristicRollbackException ex) {
            Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalStateException ex) {
            Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SystemException ex) {
            Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
Lucas_Cavalcanti

você está com o HibernateCustomProvider configurado no seu web.xml?

se sim, tire todo o código de transações das suas lógicas, o vraptor já faz isso…

se não, tire todos os imports de Transaction, tire esse monte de try…catch e faça só:

try {
   session.beginTransaction();
   //operações no banco
   session.getTransaction().commit();
} catch (Exception ex) {
   Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex);
   if (session.getTransaction() != null) {
      session.getTransaction().rollback();
   }
}

e outra coisa: não use o código Logger.getLogger(AlunoDao.class.getName()) toda hora… faça no começo da sua classe:

private static final Logger logger = Logger.getLogger(AlunoDao.class);

e use a variavel logger pra logar…

Nayane1

ÊÊÊÊÊÊÊ… deu certo, muitíssimo obrigada!!! Como eu estava usando o HibernateCustomProvider só precisei colocar session.save(aluno).

E desculpa minhas inúmeras dúvidas e erros…espero melhorar da próxima vez! =)

G

Lucas Cavalcanti:
try { session.beginTransaction(); //operações no banco session.getTransaction().commit(); } catch (Exception ex) { Logger.getLogger(AlunoDao.class.getName()).log(Level.SEVERE, null, ex); if (session.getTransaction() != null) { session.getTransaction().rollback(); } }

Lucas, permita-me te corrigir. Nunca deve-se esconder a exception. Eu colocaria alí após o transaction.rollback um throw new MyServiceException(e) para avisar as camadas superiores que ocorreu um erro para que elas possam tratar isso. As exceptions nunca devem ser simplesmente escondidas.

Lucas_Cavalcanti

@garcia-jj
verdade, falha minha =S

@Nayane@computacao
Não precisa se desculpar, a gente não se importa de responder dúvidas :wink: fique a vontade pra perguntar

Nayane1

Estou com outra dúvida.

Quero pegar uma lista de alunos no banco de dados
public List<Aluno> listaTodos(){

        List<Aluno> alunos = (List<Aluno>) session.createQuery("SELECT aluno.nome FROM aluno" );
        return new ArrayList<Aluno>();
    }

Mas dá o erro:

br.com.caelum.vraptor.InterceptionException: org.hibernate.hql.ast.QuerySyntaxException: aluno is not mapped [SELECT aluno.nome FROM aluno]

o que pode ser? Desde já, obrigada!

Nayane1
Obrigada, já resolvi aqui. Eu estava retornando a query e não o sql.
public List<Aluno> listaTodos(){

        Query query = session.createQuery("from Aluno" );
        List<Aluno> alunos = query.list();
        return alunos;
    }

Agora sim!!! :D

Criado 4 de maio de 2010
Ultima resposta 13 de mai. de 2010
Respostas 21
Participantes 4