[Resolvido]Vraptor - interceptor em todas as páginas

20 respostas
101574

Tenho uma lista de produtos, e gostaria de colocar ela disponivel em todas as páginas.
Como faço isso utilizando o interceptor do vraptor.
Grato.

@Get("/produtos")  
    public List<Produto> lista() {  
    return dao.listaTudo();  
    }

20 Respostas

Rafael_Guerreiro

Lembra que eu te expliquei isso no outro tópico?
http://www.guj.com.br/java/281565-resultado-de-lista-em-varias-paginas#post_text_1484749

Você precisa fazer isso dentro do interceptor:

101574

Ops!
Não funcionou!!!

Curte so como ficou meu interceptor.

package br.com.caelum.goodbuy.infra;

import org.hibernate.Session;

import br.com.caelum.goodbuy.controller.UsuariosController;
import br.com.caelum.goodbuy.modelo.UsuarioWeb;
import br.com.caelum.goodby.dao.SistemasDAO;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.resource.ResourceMethod;
@Intercepts
public class AutorizacaoInterceptor implements Interceptor{
	private final UsuarioWeb usuario;
	private final Result result;
	private final Session session;
	private final SistemasDAO dao;
	public AutorizacaoInterceptor(UsuarioWeb usuario, Result result, Session session,
			SistemasDAO dao) {
	this.usuario = usuario;
	this.result = result;
	this.session = session;
	this.dao = dao;
	}
      

	public boolean accepts(ResourceMethod method) {
		return !usuario.isLogado() && method.containsAnnotation(Restrito.class);
		}
	public void intercept(InterceptorStack stack, ResourceMethod method,
	Object resourceInstance) throws InterceptionException {
	result.include("sistemas", dao.listaTudo());
	result.redirectTo(UsuariosController.class).loginForm();
	}
	}

Minha classe SistemasDAO

package br.com.caelum.goodby.dao;

import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.goodbuy.modelo.Sistemas;
import br.com.caelum.vraptor.ioc.Component;


	@Component
	public class SistemasDAO {
		private final Session session;
		
		public SistemasDAO(Session session){
			this.session = session;
			
				
		}
		public List<Sistemas> listaTudo() {
			return this.session.createCriteria(Sistemas.class).list();
			//Hibernate.initialize(sistemas.getModulos());
			//Hibernate.initialize(sistemas.getRotinas()); 
			}
			
		public void salva(Sistemas sistemas) {
			Transaction tx = session.beginTransaction();
			session.save(sistemas);
			tx.commit();
		}
		public Sistemas carrega(Long id) {
			return (Sistemas) this.session.load(Sistemas.class, id);
			}
			public void atualiza(Sistemas sistemas) {
			Transaction tx = session.beginTransaction();
			this.session.update(sistemas);
			tx.commit();
			}
			public void remove(Sistemas sistemas) {
				Transaction tx = session.beginTransaction();
				this.session.delete(sistemas);
				tx.commit();
				}
			public List<Sistemas> busca(String nome) {
				return session.createCriteria(Sistemas.class).add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE)).list();			
			}
			public void recarrega(Sistemas sistemas) {
				session.refresh(sistemas);
				}

	}
Rafael_Guerreiro

Na verdade você está juntando 2 interceptors em 1:

  1. Verifica se o usuário está logado no sistema e se ele pode acessar determinada action. Se ele não puder, o interceptor (método intercept) é acionado pelo método accepts (quando este retorna true) e redireciona o usuário para a página de login.
  2. Este interceptor sempre vai ser executado (método accepts SEMPRE retorna true) e, no método intercept ele faz o include da variável na view. Lembrando que depois que a variável for configurada, o interceptor deve continuar seu curso normal, ou seja, você precisa dizer para ele seguir em frente. Isso pode ser feito com esse comando: stack.next(resourceInstance);

Ve ai e me fala.

101574

Poww brother,
Valeu pela ajuda, mas ainda não está dando certo.
Poww desculpa, mas não consigo entender como funciona a questão do interceptor no vraptor.

Eu fiz assim, não deu certo.

public void intercept(InterceptorStack stack, ResourceMethod method,
	Object resourceInstance) throws InterceptionException {
	result.include("sistemas", dao.listaTudo());
	result.redirectTo(UsuariosController.class).loginForm();
	stack.next(method, resourceInstance);
	}
Rafael_Guerreiro

Não cara, são 2 classes diferentes. Cada uma vai ser responsável por cada coisa. Não mistura, se não fica feio.

package br.com.caelum.goodbuy.infra;  
  
import org.hibernate.Session;  
  
import br.com.caelum.goodbuy.controller.UsuariosController;  
import br.com.caelum.goodbuy.modelo.UsuarioWeb;  
import br.com.caelum.goodby.dao.SistemasDAO;  
import br.com.caelum.vraptor.Get;  
import br.com.caelum.vraptor.InterceptionException;  
import br.com.caelum.vraptor.Intercepts;  
import br.com.caelum.vraptor.Result;  
import br.com.caelum.vraptor.core.InterceptorStack;  
import br.com.caelum.vraptor.interceptor.Interceptor;  
import br.com.caelum.vraptor.resource.ResourceMethod;  
@Intercepts  
public class AutorizacaoInterceptor implements Interceptor{  // Este interceptor serve SOMENTE para verificar se o usuário pode ou não acessar determinada action.
    private final UsuarioWeb usuario;  
    private final Result result;  
    private final Session session;  
    private final SistemasDAO dao;  // Sistemas faz parte da Autorização? Não! Então tira isso daqui.
    public AutorizacaoInterceptor(UsuarioWeb usuario, Result result, Session session,  
            SistemasDAO dao) {  
    this.usuario = usuario;  
    this.result = result;  
    this.session = session;  
    this.dao = dao;  
    }  
        
  
    public boolean accepts(ResourceMethod method) {  
        return !usuario.isLogado() && method.containsAnnotation(Restrito.class);  
        }  
    public void intercept(InterceptorStack stack, ResourceMethod method,  
    Object resourceInstance) throws InterceptionException {  
    result.include("sistemas", dao.listaTudo());  // Incluir a listagem na tela faz parte de Autorização? Não! Então tira isso daqui.
    result.redirectTo(UsuariosController.class).loginForm();  
    }  
    }
package br.com.caelum.goodbuy.infra;  

// Imports...

@Intercepts  
public class IncludesVariablesInViewInterceptor implements Interceptor{ // Este interceptor serve SOMENTE para setar as variáveis na tela.
    private final Result result;
    private final SistemasDAO dao;
    public IncludesVariablesInViewInterceptor(Result result,  SistemasDAO dao) {  
    this.result = result; 
    this.dao = dao;  
    }  

    public boolean accepts(ResourceMethod method) {  
        return true;// SEMPRE vai interceptar
        }  

    public void intercept(InterceptorStack stack, ResourceMethod method,  
    Object resourceInstance) throws InterceptionException {  
    result.include("sistemas", dao.listaTudo()); // Inclui a listagem na view.
   stack.next(resourceInstance); // Fala para o interceptor seguir seu curso normalmente.
    }  
    }
101574

Mano,

Desculpa ae, mas não funcionou novamente.

Putz.

Rafael_Guerreiro

Me explica o que você fez, me mostre as classes… Se deu erro, que erro deu?

Se você só me falar que não deu certo, eu assumo que você não fez nada.
Me mostra tudo o que você tentou fazer e o que você tentou fazer ALÉM do que eu disse aqui.

101574

Eu vou te confessar que estou quase desistindo de utilizar o vraptor.
rsrs.

Vamos lá.

Eu tenho a classe sistemas.

@Entity
public class Sistemas {
	@Id
	@GeneratedValue
	private long id;
	private String nome;
	private String ativo;
	private String url;
	private String imagem;
	@OneToMany(mappedBy = "sistemas",targetEntity= Modulos.class,
	fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<Modulos>modulos;
	@OneToMany(mappedBy = "sistemas2",targetEntity= Rotinas.class,
	fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<Rotinas>rotinas;

	//Métodos get e set
Tenho a SistemasController
@Resource
public class SistemasController {

private final SistemasDAO dao;
private final Result result;
private final Validator validator;

public SistemasController(SistemasDAO dao,Result result, Validator validator) {
this.dao = dao;
this.result = result;
this.validator = validator;
}
@Get("/sistemas")
@Restrito
public List<Sistemas> lista() {
return dao.listaTudo();
 }
@Post("/sistemas")
@Restrito
public void adiciona(final Sistemas sistemas) {
	dao.salva(sistemas);
	result.redirectTo(this).lista();
}
@Get("/sistemas/novo")
@Restrito
public void formulario() {
}
@Get("/sistemas/{id}")
@Restrito
public Sistemas edita(Long id) {
return dao.carrega(id);
}
@Put("/sistemas/{sistemas.id}")
@Restrito
public void altera(final Sistemas sistemas) {
	dao.atualiza(sistemas);
	result.redirectTo(this).lista();
}
@Delete("/sistemas/{id}")
@Restrito
public void remove(Long id) {
Sistemas sistemas = dao.carrega(id);
dao.remove(sistemas);
result.redirectTo(this).lista();
}
@Restrito
public List<Sistemas> busca(String nome) {
	result.include("nome", nome);
	return dao.busca(nome);
	}

@Get("/sistemas/busca.json")
@Restrito
public void buscaJson(String q) {
result.use(json()).withoutRoot()
.from(dao.busca(q))
.exclude("id")
.serialize();
}
//Imagem 
/*@Post("/sistemas/{sistemas.id}/imagem")
public void upload(Sistemas sistemas,
final UploadedFile imagem) {
	imagens.salva(imagem, sistemas);
	result.redirectTo(SistemasController.class)
	.edita(sistemas.getId());
}
@Get("/sistemas/{sistemas.id}/sistemas")
public File download(Sistemas sistemas) {
return imagens.mostra(sistemas);
}*/
}

Tenho a SistemasDAO

@Component
	public class SistemasDAO {
		private final Session session;
		
		public SistemasDAO(Session session){
			this.session = session;
			
				
		}
		public List<Sistemas> listaTudo() {
			return this.session.createCriteria(Sistemas.class).list();
			//Hibernate.initialize(sistemas.getModulos());
			//Hibernate.initialize(sistemas.getRotinas()); 
			}
			
		public void salva(Sistemas sistemas) {
			Transaction tx = session.beginTransaction();
			session.save(sistemas);
			tx.commit();
		}
		public Sistemas carrega(Long id) {
			return (Sistemas) this.session.load(Sistemas.class, id);
			}
			public void atualiza(Sistemas sistemas) {
			Transaction tx = session.beginTransaction();
			this.session.update(sistemas);
			tx.commit();
			}
			public void remove(Sistemas sistemas) {
				Transaction tx = session.beginTransaction();
				this.session.delete(sistemas);
				tx.commit();
				}
			public List<Sistemas> busca(String nome) {
				return session.createCriteria(Sistemas.class).add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE)).list();			
			}
			public void recarrega(Sistemas sistemas) {
				session.refresh(sistemas);
				}

	}

Tenho a classe para interceptar login

package br.com.caelum.goodbuy.infra;

import org.hibernate.Session;

import br.com.caelum.goodbuy.controller.UsuariosController;
import br.com.caelum.goodbuy.modelo.UsuarioWeb;
import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.resource.ResourceMethod;
@Intercepts
public class AutorizacaoInterceptor implements Interceptor{
	private final UsuarioWeb usuario;
	private final Result result;
	private final Session session;
	public AutorizacaoInterceptor(UsuarioWeb usuario, Result result, Session session) {
	this.usuario = usuario;
	this.result = result;
	this.session = session;
	}
      

	public boolean accepts(ResourceMethod method) {
		return !usuario.isLogado() && method.containsAnnotation(Restrito.class);
		}

	public void intercept(InterceptorStack stack, ResourceMethod method,
	Object resourceInstance) throws InterceptionException {
	result.redirectTo(UsuariosController.class).loginForm();
	stack.next(method, resourceInstance);
	}
	}
Tenho a classe pra Interceptar todas as páginas, e incluir nela uma view.
@Intercepts  
public class IncludesVariablesInViewInterceptor implements Interceptor {
  
 // Este interceptor serve SOMENTE para setar as variáveis na tela.  
	    private final Result result;  
	    private final SistemasDAO dao;
	    
	    public IncludesVariablesInViewInterceptor(Result result, SistemasDAO dao) {    
	    this.result = result;   
	    this.dao = dao;    
	    }    
	  
	    public boolean accepts(ResourceMethod method) {    
	        return true;// SEMPRE vai interceptar  
	        }    
	  
	    public void intercept(InterceptorStack stack, ResourceMethod method,    
	    Object resourceInstance) throws InterceptionException {    
	    result.include("sistemas", dao.listaTudo()); // Inclui a listagem na view.  
	    stack.next(method, resourceInstance); // Fala para o interceptor seguir seu curso normalmente.  
	    }    
	    }
Tenho uma interface
//a anotação vai ficar disponível em tempo de execucao
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) // anotação para métodos
public @interface Restrito {
	
}

E tenho o meu header.jsp

<html>
	
	
<body>
<div id="menuprincipal">
<ul >
	<li ><a >Home</a></li>
	<li><a >Empresa</a>
	</li>
		<li><a >Sistemas</a>
		<ul>
		&lt;c:forEach items="${sistemasList}" var="sistemas"&gt;  
                <li><a >${sistemas.nome}</a>  
                    <ul>  
                    &lt;c:forEach items="${sistemas.modulos}" var="modulos"&gt;  
                    <li> <a >${modulos.nome}</a>  
                        <ul>  
                    &lt;c:forEach items="${sistemas.rotinas}" var="rotinas"&gt;  
                     <li><a >${rotinas.nome}</a></li>  
                    &lt;/c:forEach&gt;  
                    </ul></li>  
                    &lt;/c:forEach&gt;  
                    </ul>  
                    &lt;/c:forEach&gt;  
                </li>
				</ul>
				</li>
				<li><a >Produtos</a></li>
				<li><a >Serviços</a></li>
				<li><a >Suporte</a></li>
				<li><a >Adquirir</a></li>
				<li><a href="https://webmail.softsol.com.br/">Web E-mail</a></li>
				<li><a href="https://sac.softsol.com.br/">Documentação</a>
				</li>
			<li><a href="http://www.softsol.com.br/?link=faq">Dúvidas</a></li>
			<li><a href="http://www.softsol.com.br/?link=falecom">Contato</a></li>
		</ul>
&lt;/div&gt;

Desculpa, e que eu nunca tinha trabalhado com framework. Então fico perdido as vezes.
E tem certas coisas, que eu leio documentação, procuro soluções, mas não as encontro.
Valeu pela força.

Rafael_Guerreiro
101574:
Eu vou te confessar que estou quase desistindo de utilizar o vraptor. rsrs.
Se eu fosse você, eu tentaria entender a fundo isso. Você ainda não viu todo o potencial do VRaptor. Ainda não é uma boa hora de desistir. Tem uma linha ainda que precisa ser removida:
101574:
package br.com.caelum.goodbuy.infra;

import org.hibernate.Session;

import br.com.caelum.goodbuy.controller.UsuariosController;
import br.com.caelum.goodbuy.modelo.UsuarioWeb;
import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.resource.ResourceMethod;
@Intercepts
public class AutorizacaoInterceptor implements Interceptor{
	private final UsuarioWeb usuario;
	private final Result result;
	private final Session session;
	public AutorizacaoInterceptor(UsuarioWeb usuario, Result result, Session session) {
	this.usuario = usuario;
	this.result = result;
	this.session = session;
	}
      

	public boolean accepts(ResourceMethod method) {
		return !usuario.isLogado() && method.containsAnnotation(Restrito.class);
		}

	public void intercept(InterceptorStack stack, ResourceMethod method,
	Object resourceInstance) throws InterceptionException {
	result.redirectTo(UsuariosController.class).loginForm();
	stack.next(method, resourceInstance); // ESSA LINHA AQUI SAI.
	}
	}
Isso aqui não está funcionando??
101574:
Tenho a classe pra Interceptar todas as páginas, e incluir nela uma view.
@Intercepts  
public class IncludesVariablesInViewInterceptor implements Interceptor {
  
 // Este interceptor serve SOMENTE para setar as variáveis na tela.  
	    private final Result result;  
	    private final SistemasDAO dao;
	    
	    public IncludesVariablesInViewInterceptor(Result result, SistemasDAO dao) {    
	    this.result = result;   
	    this.dao = dao;    
	    }    
	  
	    public boolean accepts(ResourceMethod method) {    
	        return true;// SEMPRE vai interceptar  
	        }    
	  
	    public void intercept(InterceptorStack stack, ResourceMethod method,    
	    Object resourceInstance) throws InterceptionException {    
	    result.include("sistemas", dao.listaTudo()); // Inclui a listagem na view.  
	    stack.next(method, resourceInstance); // Fala para o interceptor seguir seu curso normalmente.  
	    }    
	    }
101574:
Desculpa, e que eu nunca tinha trabalhado com framework. Então fico perdido as vezes. E tem certas coisas, que eu leio documentação, procuro soluções, mas não as encontro. Valeu pela força.
Então quando você estiver perdido, procure mais sobre, venha aqui no fórum e pergunte, só existe uma regra: não pode ir dormir com isso na cabeça, tenta resolver o quanto antes.

Agora a pergunta: o que não está funcionando?

E aqueles Hibernate.initialize(), por que você ainda não arrumou eles? Já que a sua classe Sistemas está com os atributos LAZY... Ou você faz isso (Eu prefiro essa aqui):
@Entity  
public class Sistemas {  
    @Id  
    @GeneratedValue  
    private long id;  
    private String nome;  
    private String ativo;  
    private String url;  
    private String imagem;  
    @OneToMany(mappedBy = "sistemas",targetEntity= Modulos.class,  
    fetch = FetchType.EAGER, cascade = CascadeType.ALL)  // Troca de LAZY para EAGER
    private List&lt;Modulos&gt;modulos;  
    @OneToMany(mappedBy = "sistemas2",targetEntity= Rotinas.class,  
    fetch = FetchType.EAGER, cascade = CascadeType.ALL)  // Troca de LAZY para EAGER
    private List&lt;Rotinas&gt;rotinas;  
  
    //Métodos get e set
Ou você faz isso:
@Component  
    public class SistemasDAO {  
        private final Session session;  
          
        public SistemasDAO(Session session){  
            this.session = session;  
              
                  
        }  
// ERA ISSO AQUI QUE EU QUERIA QUE VOCÊ FIZESSE NAQUELE DIA EM QUE EU TE EXPLIQUEI SOBRE O HIBERNATE.INITIALIZE()...
        public List&lt;Sistemas&gt; listaTudo() {  
            List&lt;Sistemas&gt; sistemas = this.session.createCriteria(Sistemas.class).list();
            for (Sistemas sistema : sistemas){
               Hibernate.initialize(sistema.getModulos());  
               Hibernate.initialize(sistema.getRotinas());   
            }
            return sistemas;  
            }  
              
        public void salva(Sistemas sistemas) {  
            Transaction tx = session.beginTransaction();  
            session.save(sistemas);  
            tx.commit();  
        }  
        public Sistemas carrega(Long id) {  
            return (Sistemas) this.session.load(Sistemas.class, id);  
            }  
            public void atualiza(Sistemas sistemas) {  
            Transaction tx = session.beginTransaction();  
            this.session.update(sistemas);  
            tx.commit();  
            }  
            public void remove(Sistemas sistemas) {  
                Transaction tx = session.beginTransaction();  
                this.session.delete(sistemas);  
                tx.commit();  
                }  
            public List&lt;Sistemas&gt; busca(String nome) {  
                return session.createCriteria(Sistemas.class).add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE)).list();           
            }  
            public void recarrega(Sistemas sistemas) {  
                session.refresh(sistemas);  
                }  
  
    }
101574
@Intercepts    
    public class IncludesVariablesInViewInterceptor implements Interceptor {  
        
    // Este interceptor serve SOMENTE para setar as variáveis na tela.    
            private final Result result;    
            private final SistemasDAO dao;  
              
            public IncludesVariablesInViewInterceptor(Result result, SistemasDAO dao) {      
            this.result = result;     
            this.dao = dao;      
            }      
            
            public boolean accepts(ResourceMethod method) {      
                return true;// SEMPRE vai interceptar    
                }      
            
            public void intercept(InterceptorStack stack, ResourceMethod method,      
            Object resourceInstance) throws InterceptionException {      
            result.include("sistemas", dao.listaTudo()); // Inclui a listagem na view.    
            stack.next(method, resourceInstance); // Fala para o interceptor seguir seu curso normalmente.    
            }      
            }

Não funciona!!!
Acredita!
Fiz tudo que você mandou.
Não rola.

Rafael_Guerreiro

Você debugou? Verificou se o interceptor está sendo chamado?

Verificou se a variável está indo para a tela?

101574

Como eu faço isso?
Nao sei.

101574

Não entendo muito!
Mas olha, toda vez que eu abro uma página.
Ele coloca isso no console.

Hibernate: select this_.id as id0_0_, this_.ativo as ativo0_0_, this_.imagem as imagem0_0_, this_.nome as nome0_0_, this_.url as url0_0_ from Sistemas this_

Agora, quando eu abro a página sistemas, onde lista o menu corretamente, ele lista assim.

Hibernate: 
    select
        this_.id as id0_0_,
        this_.ativo as ativo0_0_,
        this_.imagem as imagem0_0_,
        this_.nome as nome0_0_,
        this_.url as url0_0_ 
    from
        Sistemas this_
Hibernate: 
    select
        this_.id as id0_0_,
        this_.ativo as ativo0_0_,
        this_.imagem as imagem0_0_,
        this_.nome as nome0_0_,
        this_.url as url0_0_ 
    from
        Sistemas this_
Hibernate: 
    select
        modulos0_.sistemas_id as sistemas6_0_1_,
        modulos0_.id as id1_,
        modulos0_.id as id1_0_,
        modulos0_.ativo as ativo1_0_,
        modulos0_.imagem as imagem1_0_,
        modulos0_.nome as nome1_0_,
        modulos0_.sistemas_id as sistemas6_1_0_,
        modulos0_.url as url1_0_ 
    from
        Modulos modulos0_ 
    where
        modulos0_.sistemas_id=?
Hibernate: 
    select
        modulos0_.sistemas_id as sistemas6_0_1_,
        modulos0_.id as id1_,
        modulos0_.id as id1_0_,
        modulos0_.ativo as ativo1_0_,
        modulos0_.imagem as imagem1_0_,
        modulos0_.nome as nome1_0_,
        modulos0_.sistemas_id as sistemas6_1_0_,
        modulos0_.url as url1_0_ 
    from
        Modulos modulos0_ 
    where
        modulos0_.sistemas_id=?
Hibernate: 
    select
        modulos0_.sistemas_id as sistemas6_0_1_,
        modulos0_.id as id1_,
        modulos0_.id as id1_0_,
        modulos0_.ativo as ativo1_0_,
        modulos0_.imagem as imagem1_0_,
        modulos0_.nome as nome1_0_,
        modulos0_.sistemas_id as sistemas6_1_0_,
        modulos0_.url as url1_0_ 
    from
        Modulos modulos0_ 
    where
        modulos0_.sistemas_id=?
Hibernate: 
    select
        modulos0_.sistemas_id as sistemas6_0_1_,
        modulos0_.id as id1_,
        modulos0_.id as id1_0_,
        modulos0_.ativo as ativo1_0_,
        modulos0_.imagem as imagem1_0_,
        modulos0_.nome as nome1_0_,
        modulos0_.sistemas_id as sistemas6_1_0_,
        modulos0_.url as url1_0_ 
    from
        Modulos modulos0_ 
    where
        modulos0_.sistemas_id=?
Hibernate: 
    select
        modulos0_.sistemas_id as sistemas6_0_1_,
        modulos0_.id as id1_,
        modulos0_.id as id1_0_,
        modulos0_.ativo as ativo1_0_,
        modulos0_.imagem as imagem1_0_,
        modulos0_.nome as nome1_0_,
        modulos0_.sistemas_id as sistemas6_1_0_,
        modulos0_.url as url1_0_ 
    from
        Modulos modulos0_ 
    where
        modulos0_.sistemas_id=?
Hibernate: 
    select
        rotinas0_.sistemas_id as sistemas7_0_3_,
        rotinas0_.id as id3_,
        rotinas0_.id as id3_2_,
        rotinas0_.ativo as ativo3_2_,
        rotinas0_.imagem as imagem3_2_,
        rotinas0_.modulos_id as modulos6_3_2_,
        rotinas0_.nome as nome3_2_,
        rotinas0_.sistemas_id as sistemas7_3_2_,
        rotinas0_.url as url3_2_,
        modulos1_.id as id1_0_,
        modulos1_.ativo as ativo1_0_,
        modulos1_.imagem as imagem1_0_,
        modulos1_.nome as nome1_0_,
        modulos1_.sistemas_id as sistemas6_1_0_,
        modulos1_.url as url1_0_,
        sistemas2_.id as id0_1_,
        sistemas2_.ativo as ativo0_1_,
        sistemas2_.imagem as imagem0_1_,
        sistemas2_.nome as nome0_1_,
        sistemas2_.url as url0_1_ 
    from
        Rotinas rotinas0_ 
    left outer join
        Modulos modulos1_ 
            on rotinas0_.modulos_id=modulos1_.id 
    left outer join
        Sistemas sistemas2_ 
            on modulos1_.sistemas_id=sistemas2_.id 
    where
        rotinas0_.sistemas_id=?

Parece que ele lista vazio nas outras páginas.

101574

Olha o que eu fiz na classe.
Pra testar o interceptor.

public void intercept(InterceptorStack stack, ResourceMethod method,    
	    Object resourceInstance) throws InterceptionException {
	    	System.out.println("Interceptor1");
	        result.include( "sistemas",dao.listaTudo()); // Inclui a listagem na view.
	    	System.out.println("Interceptor2");
	        stack.next(method, resourceInstance); // Fala para o interceptor seguir seu curso normalmente.
	    	System.out.println("Interceptor3");

	        
	    }

Resultado quando abro a página incial por exemplo.

Interceptor1
Hibernate: 
    select
        this_.id as id0_0_,
        this_.ativo as ativo0_0_,
        this_.imagem as imagem0_0_,
        this_.nome as nome0_0_,
        this_.url as url0_0_ 
    from
        Sistemas this_
Interceptor2
Interceptor3

Creio que o erro está na linha.

result.include( "sistemas",dao.listaTudo()); // Inclui a listagem na view.
Rafael_Guerreiro

Você arrumou a classe Sistemas para EAGER ou arrumou o DAO para fazer o Hibernate.initialize?

101574

Fiz a alteração no DAO.
Testei, não funcionou!

Fiz alteração do Eager.
Testei, não funcionou!

Voltei ao estado antigo.

Você viu os logs que te mandei?

Rafael_Guerreiro

Eu vi os logs que você me mandou, aquilo lá significa que o Hibernate só carregou a classe sistemas por que ele achou que você não ia usar as outras listas… Me mostra como que você fez essas alterações.

Isso que você está tendo é problema no Hibernate e não no VRaptor, ok?

101574

Brother,
Consegui!
E o seguinte, eu por não saber. Tinha retirado da linha. A palavra List, tinha deixado apenas sistemas.

result.include( "sistemasList",dao.listaTudo()); // Inclui a listagem na view.

Com as alterações que VOCÊ FEZ PARA MIM, criando um interceptor para todas as páginas.
E com essa linha corrigida, funcionou!
Você não tem noção o quanto me ajudou. Valeu mesmo cara. Já estava pra ficar louco.
Então o código ficou assim.

Para incluir um método em todas as páginas, precisamos criar um interceptor para isso.
Então temos…

@Intercepts  
public class IncludesVariablesInViewInterceptor implements Interceptor {
  
 // Este interceptor serve SOMENTE para setar as variáveis na tela.  
	    private final Result result;  
	    private final SistemasDAO dao;
	    
	    public IncludesVariablesInViewInterceptor(Result result, SistemasDAO dao) {    
	    this.result = result;   
	    this.dao = dao;    
	    }    
	  
	    public boolean accepts(ResourceMethod method) {    
	        return true;// SEMPRE vai interceptar  
	        }    
	  
	    public void intercept(InterceptorStack stack, ResourceMethod method,    
	    Object resourceInstance) throws InterceptionException {
	        result.include( "sistemasList",dao.listaTudo()); // Inclui a listagem na view.
	        stack.next(method, resourceInstance); // Fala para o interceptor seguir seu curso normalmente.

	    }    
	    }

Metodo que precisa estar em todas as páginas.

@Get("/produtos")
public List&lt;Produto&gt; lista() {
return dao.listaTudo();
 }

Tópico resolvido!

Valeu!

Rafael_Guerreiro

Bom, ainda existe uma melhoria:
Aquela sua action que retorna uma lista de Sistemas, não precisa mais retorná-la, pois o interceptor já vai fazer isso…

Só precisa tomar cuidado se algum dia você mudar o interceptor.

Ainda bem que funcionou. Procura entender cada coisinha que foi feita…

Abraços e sucesso.

101574

Ok!
Vou ver isso!
Nossa aprendi muito!
Eu até já resolvi um outro problema.
Tinha criado um controle de usuários, e precisa que fosse feita a verificação em todas as páginas.
Com esse interceptor em todas as páginas, foi fácil.
Claro que criei outro.rsrs.
Valeu mesmo!
Desculpa ae qualquer coisa.

Criado 10 de setembro de 2012
Ultima resposta 11 de set. de 2012
Respostas 20
Participantes 2