VRaptor 3 - Error creating bean with name

30 respostas
W

Pessoal,
criei um projeto com VRaptor-blank, fiz as alterações para o meu projeto, tudo funciona direitinho.
Criei um DAO generico e testei com uma classe executável e funcionou, consegui gravar usuario no banco e listar usuarios na tela.
Não estou conseguindo fazer isso com o controller. Eu criei UsuarioController e um jsp de form e outro de lista.

// Meu controller
package br.com.spg.portal;

import java.util.List;

import br.com.caelum.vraptor.Resource;

import br.com.spg.portal.dao.Dao;

import br.com.spg.portal.modelo.Usuario;
<a class="mention" href="/u/resource">@Resource</a>

public class UsuarioController {

private Dao dao;
public List<Usuario> lista() {
    return dao.listaTudo();
}

public UsuarioController(Dao<Usuario> dao) {
    this.dao = dao;
}

public void form() {
}

public void add(Usuario custom) {
     dao.adiciona(custom);
}

public Usuario view(Long id) {
    return dao.procura(id);
}

}

// DAO Generico
package br.com.spg.portal.dao;

import java.util.List;
import org.hibernate.Session;

public class Dao {

private final Session session;

private final Class classe;
Dao(Session session, Class classe) {
    this.session = session;
    this.classe = classe;
}

public void adiciona(T u) {
    this.session.save(u);
}

public void remove(T u) {
    this.session.delete(u);
}

public void atualiza(T u) {
    this.session.merge(u);
}

public List<T> listaTudo() {
    return this.session.createCriteria(classe).list();
}

public T procura(Long id) {
    return (T) session.load(classe, id);
}

}

// DAO Factory
package br.com.spg.portal.dao;

import org.hibernate.Session;

import org.hibernate.Transaction;

import br.com.spg.portal.modelo.Usuario;

import br.com.spg.portal.util.HibernateUtil;
public class DaoFactory {

private final Session session;

private Transaction transaction;
public DaoFactory() {
    session = HibernateUtil.getSession();
}

public void beginTransaction() {
    this.transaction = this.session.beginTransaction();
}

public void commit() {
    this.transaction.commit();
    this.transaction = null;
}

public boolean hasTransaction() {
    return this.transaction != null;
}

public void rollback() {
    this.transaction.rollback();
    this.transaction = null;
}

public void close() {
    this.session.close();
}

public Dao<Usuario> getUsuarioDao() {
    return new Dao<Usuario>(this.session, Usuario.class);
}

}

// JSP de lista
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
<%@ page language=“java” contentType="text/html; charset=ISO-8859-1"
pageEncoding=“ISO-8859-1”%>

Insert title here
  • ${produto.nome} - ${produto.descricao}

E estes são os erros:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name usuarioController defined in file [C:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\portal\WEB-INF\classes\br\com\spg\portal\UsuarioController.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [br.com.spg.portal.dao.Dao]: : No unique bean of type [br.com.spg.portal.dao.Dao] is defined: Unsatisfied dependency of type [class br.com.spg.portal.dao.Dao]: expected at least 1 matching bean; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [br.com.spg.portal.dao.Dao] is defined: Unsatisfied dependency of type [class br.com.spg.portal.dao.Dao]: expected at least 1 matching bean

org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:591)

org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:193)

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:925)

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:835)

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440)

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)

java.security.AccessController.doPrivileged(Native Method)

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)

org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:302)

org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)

org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)

org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)

org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)

org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:308)

org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:297)

org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:942)

org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:224)

br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:209)

br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:61)

br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)

br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:40)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:74)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:51)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:60)

br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)

br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)

br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)

root cause

org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [br.com.spg.portal.dao.Dao] is defined: Unsatisfied dependency of type [class br.com.spg.portal.dao.Dao]: expected at least 1 matching bean

org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:613)

org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:622)

org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:584)

org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:193)

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:925)

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:835)

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440)

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)

java.security.AccessController.doPrivileged(Native Method)

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)

org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:302)

org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)

org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)

org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)

org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)

org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:308)

org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:297)

org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:942)

org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:224)

br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:209)

br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:61)

br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)

br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:40)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:74)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:51)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:60)

br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)

br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)

br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.18 logs.
Apache Tomcat/6.0.18

Alguem sabe me dizer qual o problema? E uma solução também. rs

30 Respostas

kokol_fmt

tanta colocar @Component no seu Dao

Lucas_Cavalcanti

olá wcoutinho…

você precisa falar pro VRaptor como criar o Dao, senão ele não consegue injetar uma instância do Dao nas suas classes…

se você quer que ele seja criado via DaoFactory você precisa criar um component factory:
http://vraptor.caelum.com.br/documentacao/injecao-de-dependencias/

ou vc pode criar uma implementação anotada com @Component:

@Component
public class UsuarioDao extends Dao<Usuario> {
    public UsuarioDao(Session session) {
       super(session, Usuario.class);
    }
}

Usando o VRaptor você não precisa mais do DaoFactory, o próprio VRaptor pode se encarregar de criar os seus daos…
mas precisa criar as classes de implementação…

uma terceira opção (não muito boa) é receber DaoFactory nas suas lógicas, e chamar o getUsuarioDao… para isso o DaoFactory precisa estar anotado com @Component

Lagaffe

Lucas

Aproveitando o assunto, estou com uma dúvida.

A recomendação então é criar uma Dao específica para cada classe: UsuarioDao, ClienteDao, EnderecoDao, CidadeDao, anotadas com @Component e injetar uma instancia de cada classe necessária no(s) controller(s) via construtor?

Eu não entendi quando você diz: "Usando o VRaptor você não precisa mais do DaoFactory, o próprio VRaptor pode se encarregar de criar os seus daos…
mas precisa criar as classes de implementação… " ou é o que estou perguntando no paragrafo anterior?

Qual o motivo para não ser uma boa opção usar o DaoFactory?

Obrigado

Lucas_Cavalcanti

Em muitos casos é melhor você criar um Dao para cada entidade mesmo…
Por exemplo, na entidade Usuário não faz sentido remover…
na entidade Estado não quero adicionar, pois todos os estados já estão pré-definidos…

Outro exemplo é se você precisar de uma listagem mais específica, que não vai estar no Dao genérico…
Por exemplo, vc quer listar soh os usuários ativos… Se você está recebendo na sua lógica um Dao
você não consegue chamar essa listagem, pois ela só vai estar no específico (UsuarioDao)

Você precisa do DaoFactory quando você precisa criar na mão todos os DAOs (dar new)…

Quando você usa um container de injeção de dependências (usando o VRaptor você ganha o Spring para isso)
o container se encarrega de criar (dar new) nas classes pra você, logo você não precisa criar o DaoFactory
para criar os daos… o VRaptor faz isso pra você…

W

Bom dia Lucas,
eu ainda não estou conseguindo fazer as coisas funcionarem aqui.

Eu exclui o DaoFactory e criei o UsuarioDao.
As minhas classes estão assim agora.

package br.com.spg.portal.dao;

import java.util.List;

import org.hibernate.Session;

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

@Component

public class Dao {

private final Session session;

private final Class classe;

Dao(Session session, Class classe) {

this.session = session;

this.classe = classe;

}

public void adiciona(T u) {

this.session.save(u);

}

public void remove(T u) {

this.session.delete(u);

}

public void atualiza(T u) {

this.session.merge(u);

}

public List listaTudos() {

return this.session.createCriteria(classe).list();

}

public T procura(Long id) {

return (T) session.load(classe, id);

}

}
package br.com.spg.portal.dao;

import org.hibernate.Session;

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

import br.com.spg.portal.modelo.Usuario;

@Component

public class UsuarioDao extends Dao {

public UsuarioDao(Session session) {

super(session, Usuario.class);

}

}
package br.com.spg.portal;

import java.util.List;

import br.com.caelum.vraptor.Resource;

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

import br.com.spg.portal.dao.UsuarioDao;

import br.com.spg.portal.modelo.Usuario;

<a class="mention" href="/u/resource">@Resource</a>

@Component

public class UsuarioController {

private final UsuarioDao dao;

public List lista() {

return dao.listaTudos();

}

public UsuarioController(UsuarioDao dao) {

this.dao = dao;

}

public void form() {

}

public void add(Usuario custom) {

dao.adiciona(custom);

}

public Usuario view(Long id) {

return dao.procura(id);

}

}

e continua dando os erros abaixo.

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘usuarioController’ defined in file [C:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\portal\WEB-INF\classes\br\com\spg\portal\UsuarioController.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [br.com.spg.portal.dao.UsuarioDao]: : Error creating bean with name ‘usuarioDao’ defined in file [C:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\portal\WEB-INF\classes\br\com\spg\portal\dao\UsuarioDao.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.Session]: : No unique bean of type [org.hibernate.Session] is defined: Unsatisfied dependency of type [interface org.hibernate.Session]: expected at least 1 matching bean; nested exception is 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; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘usuarioDao’ defined in file [C:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\portal\WEB-INF\classes\br\com\spg\portal\dao\UsuarioDao.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.Session]: : No unique bean of type [org.hibernate.Session] is defined: Unsatisfied dependency of type [interface org.hibernate.Session]: expected at least 1 matching bean; nested exception is 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

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘usuarioDao’ defined in file [C:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\portal\WEB-INF\classes\br\com\spg\portal\dao\UsuarioDao.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.Session]: : No unique bean of type [org.hibernate.Session] is defined: Unsatisfied dependency of type [interface org.hibernate.Session]: expected at least 1 matching bean; nested exception is 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

Se eu comento no controller as linhas

public UsuarioController(UsuarioDao dao) {
	this.dao = dao;
}

e declaro o dao assim

private UsuarioDao dao;

consigo acessar o form.

O que estou fazendo de errado?

wariows

Você precisa registrar o SessionFactoryCreator e o SessionCreator que vem com o vRaptor, faz assim:

Cria um provider:

public class CustomProvider extends SpringProvider {
   
    @Override
    protected void registerCustomComponents(ComponentRegistry registry) {
        registry.register(SessionFactoryCreator.class, SessionFactoryCreator.class);
        registry.register(SessionCreator.class, SessionCreator.class);
        registry.register(HibernateTransactionInterceptor.class, HibernateTransactionInterceptor.class);
    }
}

Configura o xml para usá-lo:

<context-param>
    <param-name>br.com.caelum.vraptor.provider</param-name>
    <param-value>br.com.nomedaempresa.nomedoprojeto.CustomProvider</param-value>
</context-param>

[]'s

Lucas_Cavalcanti

@wariows, na versão 3.0.2 do VRaptor você não precisa criar esse provider… é só registrar, no web.xml

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

@wcoutinho,
você não precisa (e não deve) colocar @Component no controller… o @Resource já é o suficiente para habilitar
a injeção de dependências… e tire o @Component do seu Dao… pois o VRaptor não vai conseguir criá-lo
(ele recebe um Class no construtor, não tem como saber qual class colocar…)

e coloque o pedaço de xml acima no seu web.xml que vai funcionar…

[]'s

W

Ok,
vou alterar e testar novamente.
obrigado

W

Lucas,
funcionou!

Agora está dando um seguinte erro:

14:19:18,302 WARN [JstlLocalization ] couldn’t find message bundle, creating an empty one
java.util.MissingResourceException: Can’t find bundle for base name messages, locale pt_BR

Como acerto isso?

wariows

cria um messages.properties em algum lugar do teu classpath

Lagaffe

Tire o @component do Dao! Imagine, quem faria isso? E não é que o meu estava com @component!

Entendi Lucas (sobre o DaoFactory). Eu vejo duas outras vantagem de usar o DaoFactory: não precisar criar uma série de Dao’s especificas para aquelas classes que tem só os métodos básicos que estão no Dao e que podem ser herdados e não precisar incluir no construtor do controller uma série de Daos. Por exemplo tenho um controller que usa mais de 20 entidades. Por outro lado você teria uma série de entidades com métodos que não vão e não podem ser usados! Imagino que devemos estudar os prós e os contras em cada projeto.
Talvez esteja falando besteira. Ainda sou novato em Java.

Estou tendo a impressão de estar fazendo uma conversa cruzada. Se for o caso posso abrir um outro tópico.

Lucas_Cavalcanti

Olá Lagaffe,

sim, usar o DaoFactory tem suas vantagens e desvantagens, sem dúvida… Mas esse “design pattern” foi criado pra resolver
um problema, e acho que ele não existe mais no VRaptor3, por causa da injeção de dependencias…

e teoricamente vc não deve criar um controller que mexe com 20 entidades :wink: Cada controller deve ter uma pequena e clara
responsabilidade, por exemplo controlar o cadastro de produtos, fazer o processo de venda, etc…

=)

W

Lucas,
eu aprendi java em 2007 e so agora estou trabalhando com java. Quando aprendi java, aprendi em fazer um unico servlert controlador e este servlet chamar a operação referente a requisição recebida.
Não conheço a estrutura interna do VRaptor sei que está tudo encapsulado mas a visão que tenho é que tem um “servlet” (controller) para cada operação.

wariows

Como a maioria dos frameworks MVC, o vRaptor também possui um FrontController (que é o que vc acabou de falar, porém no caso do vraptor3, é implementado com um Filter e não com um Servlet).

Lucas_Cavalcanti

O VRaptor 3 tem um controlador principal que delega para os controladores da sua aplicação…

mas vc não é obrigado (e nem deve) criar um controller por operação… Você precisa de um método java para cada operação, mas podem ter vários num mesmo controller, e portanto várias operações

Lagaffe

Olá Lucas,

Esse controller com muitas entidades me deixa desconfortável, mas não vejo alternativa. Na realidade eu estou com uma entidade só. Porém ela tem muitos relacionamentos ManyToOne e alguns OneToMany. Com as entidades para as quais tenho relacionamento ManyToOne eu preciso delas no controller para trazer os dados para a view (dropdown), talvez ajax seja uma opção. Com os OneToMany e ManyToMany preciso das entidades no controller para ler e gravar no banco.

W

Valeu pela explicação.

Uma coisa que esta acontecendo comigo agora é que após o formulário estar sendo validado, está voltando com os campos vazios. O que estou fazendo de errado?

Meu método adiciona

public void adiciona(final Usuario usuario) {
	validator.checking(new Validations() {{
		that(!usuario.getLogin().isEmpty(), "usuario.login", "login.vazio");
		that(!usuario.getSenha().isEmpty(), "usuario.senha", "senha.vazio");
		}});
	validator.onErrorUse(Results.page()).of(UsuarioController.class).form();
		
	dao.adiciona(usuario);
	result.use(Results.logic()).redirectTo(UsuarioController.class).lista();
}

Meu formulário

<%@page pageEncoding=“UTF-8” contentType=“text/html; charset=UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>

Cadastro de usuarios

Cadastro de usuarios

"> Login:
Senha:

<c:forEach var=“error” items="${errors}">

${error.category} ${error.message}


</c:forEach>
Lucas_Cavalcanti

Se você quer que os campos voltem preenchidos vc precisa fazer:

<form action="<c:url value="/usuario/adiciona"/>">
Login: <input type="text" name="usuario.login" value="${usuario.login}" /><br />
Senha: <input type="text" name="usuario.senha" value="${usuario.senha}" /><br />
<input type="submit" value="Salvar" />
</form><br>

[]'s

cinei

Neste caso, o Vraptor me fornece a sessão do hibernate?

factory = conf.buildSessionFactory()
Lucas_Cavalcanti

não entendi sua pergunta, cinei

cinei

Para acessar os dados com o Hibernate, preciso de uma sessão aberta. Criei a famosa classe HibernateUtil:

private static SessionFactory factory;
	static {
		Configuration conf = new AnnotationConfiguration();
		conf.configure();
		factory = conf.buildSessionFactory();
	}
	public static Session getSession() {
		return factory.openSession();
	}

Como criei também a DaoFactory, tenho:

@Component
 public class DaoFactory {
	protected final Session session;
	protected Transaction transaction;
	private Paginador paginador;

	public DaoFactory() {
		session = HibernateUtil.getSession();
.
.
.

Se eu eliminar a DaoFactory, precisarei prover de alguma forma a Sesion.
E ainda precisarei ter controle sobre os momentos de Commit e Rolback.
Não entendi de onde veio a sessao na discussão deste post.
abraço!

Lucas_Cavalcanti

se vc registrar o HibernateCustomProvider:
http://vraptor.caelum.com.br/documentacao/componentes-utilitarios-opcionais/

vc ganha a Session de graça pra receber nos construtores, e ele vai abrir uma transação no começo da requisição e commitar/rollback no fim da requisição…
se isso for suficiente vc pode usar isso…

cinei

Obrigado Lucas, vou ler mais um pouco a documentação.
Me parece que misturei as bolas, e não usei o que o VRaptor me fornece.
Extendi o SpringProvider (versão 3.0) e registrei. Depois atualizei para a versão 3.02.

public class CustomProvider extends SpringProvider {

	@Override
	protected void registerCustomComponents(ComponentRegistry registry) {
		registry.register(SessionCreator.class, SessionCreator.class);
		registry.register(SessionFactoryCreator.class, SessionFactoryCreator.class);

		registry.register(HibernateTransactionInterceptor.class, HibernateTransactionInterceptor.class);
	}
Lucas_Cavalcanti

se a classe for exatamente essa, vc não precisa dela, basta colocar no seu web.xml:

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

(se tiver outro param com br.com.caelum.vraptor.provider, substitua)

W

.

G

lucascs:
se a classe for exatamente essa, vc não precisa dela, basta colocar no seu web.xml:

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

(se tiver outro param com br.com.caelum.vraptor.provider, substitua)

Hoje olhei isso nos fontes da my-dvds, está usando essa classe assim como o cinei descreveu.

W

Oi Lucas,

coloquei os values no meu formulário, esta assim agora

"> Login:
Senha:

mesmo assim nao está apagando os campos depois da validação.

tem mais alguma configuração pra fazer?

Lucas_Cavalcanti

o que vc pos no validator.onErrorUse(…)?

não tem nenhuma configuração adicional não… (se vc estiver usando a versão mais nova 3.0.2)

@garcia-jj:
o my-dvds não foi atualizado da versão 3.0.1 pra 3.0.2… falha nossa =(

W

Está assim

public void adiciona(final Usuario usuario) {

validator.checking(new Validations() {{

that(!usuario.getLogin().isEmpty(), usuario.login, login.vazio);

that(!usuario.getSenha().isEmpty(), usuario.senha, senha.vazio);

}});

validator.onErrorUse(Results.page()).of(UsuarioController.class).form();
dao.adiciona(usuario);

result.use(Results.logic()).redirectTo(UsuarioController.class).lista();

}
Lucas_Cavalcanti

tenta colocar:

validator.onErrorUse(Results.logic()).forwardTo(UsuarioController.class).form();

se funcionar, pode ser um bug no VRaptor… =(

[]'s

Criado 18 de novembro de 2009
Ultima resposta 24 de nov. de 2009
Respostas 30
Participantes 7