Estou desenvolvendo um projeto com vraptor, e fiz um menu dinâmico.
Eu tenho as classes.
Sistemas
Módulos
Rotinas.
Cada Sistema contém vários Módulos.
Cada Módulo Contém várias Rotinas.
Implementei usando hibernate, vraptor.
Fiz um for para listar todos eles, e coloquei alguns if para listar somente os módulos do sistemas e assim sucessivamente.
Mas não está funcionando.
Quando eu abro a tela de listar sistemas, ele lista somente os sistemas. E nas demais ele não lista nada.
Como eu resolvo isso?
Eu coloquei ele no arquivo header.jspf
Para aparecer em todas as páginas.
Está aparecendo.
Mais o menu sistemas, não abre.
Quando eu abro uma página que lista os sistemas, ele abre pra mim somente os sistemas.
E como a gente pode ver, além dos sistemas eu tenho módulos e rotinas.
E so abre quando eu listo os sistemas.
Não entendi porque isso.
Tem alguma solução?
Rafael_Guerreiro
Pode me mostrar as classes Sistemas, Modulos e Rotinas?
Por colocar no Header, vc precisa colocar o result.include(‘sistemas’, sistemas); em um interceptor para que ele coloque isso na tela o tempo todo para vc. não basta colocar uma vez.
101574
Aqui estão.
Sistemas.java
@EntitypublicclassSistemas{@Id@GeneratedValueprivatelongid;privateStringnome;privateStringativo;privateStringurl;privateStringimagem;@OneToMany(mappedBy="sistemas",targetEntity=Modulos.class,fetch=FetchType.LAZY,cascade=CascadeType.ALL)privateList<Modulos>modulos;@OneToMany(mappedBy="sistemas2",targetEntity=Rotinas.class,fetch=FetchType.LAZY,cascade=CascadeType.ALL)privateList<Rotinas>rotinas;//Métodos get e setpubliclonggetId(){returnid;}publicvoidsetId(longid){this.id=id;}publicStringgetNome(){returnnome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicStringgetAtivo(){returnativo;}publicvoidsetAtivo(Stringativo){this.ativo=ativo;}publicStringgetUrl(){returnurl;}publicvoidsetUrl(Stringurl){this.url=url;}publicStringgetImagem(){returnimagem;}publicList<Rotinas>getRotinas(){returnrotinas;}publicvoidsetRotinas(List<Rotinas>rotinas){this.rotinas=rotinas;}publicvoidsetImagem(Stringimagem){this.imagem=imagem;}publicList<Modulos>getModulos(){returnmodulos;}publicvoidsetModulos(List<Modulos>modulos){this.modulos=modulos;}}
Módulos.java
@EntitypublicclassModulos{@Id@GeneratedValueprivatelongid;privateStringnome;privateStringativo;privateStringurl;privateStringimagem;//Relacionamento com Rotinas@OneToMany(mappedBy="modulos",targetEntity=Rotinas.class,fetch=FetchType.LAZY,cascade=CascadeType.ALL)privateList<Rotinas>rotinas;//Relacionamento com Sistemas@ManyToOne@JoinColumn(name="sistemas_id")privateSistemassistemas;//Métodos get e setpubliclonggetId(){returnid;}publicvoidsetId(longid){this.id=id;}publicStringgetNome(){returnnome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicStringgetAtivo(){returnativo;}publicvoidsetAtivo(Stringativo){this.ativo=ativo;}publicStringgetUrl(){returnurl;}publicvoidsetUrl(Stringurl){this.url=url;}publicStringgetImagem(){returnimagem;}publicvoidsetImagem(Stringimagem){this.imagem=imagem;}publicSistemasgetSistemas(){returnsistemas;}publicvoidsetSistemas(Sistemassistemas){this.sistemas=sistemas;}publicList<Rotinas>getRotinas(){returnrotinas;}publicvoidsetRotinas(List<Rotinas>rotinas){this.rotinas=rotinas;}}
rotinas.java
@EntitypublicclassRotinas{@Id@GeneratedValueprivatelongid;privateStringnome;privateStringativo;privateStringurl;privateStringimagem;//Relacionamento com Modulos@ManyToOne@JoinColumn(name="modulos_id")privateModulosmodulos;//Relacionamento com Sistemas@ManyToOne@JoinColumn(name="sistemas_id")privateSistemassistemas2;publicSistemasgetSistemas2(){returnsistemas2;}publicvoidsetSistemas2(Sistemassistemas2){this.sistemas2=sistemas2;}//Métodos get e setpubliclonggetId(){returnid;}publicvoidsetId(longid){this.id=id;}publicStringgetNome(){returnnome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicStringgetAtivo(){returnativo;}publicvoidsetAtivo(Stringativo){this.ativo=ativo;}publicStringgetUrl(){returnurl;}publicvoidsetUrl(Stringurl){this.url=url;}publicStringgetImagem(){returnimagem;}publicvoidsetImagem(Stringimagem){this.imagem=imagem;}publicModulosgetModulos(){returnmodulos;}publicvoidsetModulos(Modulosmodulos){this.modulos=modulos;}}
Tem ainda a controller e dao de cada.
Se precisar, avisa.
Agora,
Não entendi bem.
Rafael_Guerreiro
Caraca, mas que relacionamento complicado, ruim isso…
Por que um Sistema tem várias Rotinas se o Módulo já tem várias Rotinas?
Da uma analisada nisso que eu fiz.
Bom, pelo o que você me disse, esse menu está no header.jspf para aparecer em todas as páginas, pois então, você precisa definir o que será colocado dentro de ${sistemasList} o tempo todo…
Me mostra a action que você chama e o menu funciona.
@Get("/sistemas")
public List<Sistemas> lista() {
return dao.listaTudo();
}
é igual a isso:
@Get("/sistemas")
public void lista() {
result.include("sistemasList", dao.listaTudo());
}
Pois então, você precisa executar aquele include em TODAS as requisições. Ou seja, crie um interceptor que vai fazer aquilo.
101574
Oo mano,
Valeu pela ajuda.
Mas não entendi.
A questão do interceptor.
E meu próximo passo, a implementação do interceptor para login e afins.
Vou estudar, e qualquer coisa eu volto.
Rafael_Guerreiro
Tudo bem. Estude bastante tudo isso.
No menu, você entendeu o que foi feito? Funcionou? Mostrou todos os sub menus?
E no seu modelo, repito a minha pergunta:
“Por que um Sistema tem várias Rotinas se o Módulo já tem várias Rotinas?”
101574
Não tive como testar o menu.
Porque lembra, que ele só lista os sistemas, no método lista do sistemas?
Então,
As vezes eu preciso relacionar apenas sistemas e rotinas.
Por isso que temos um campo do sistemas nas rotinas.
Ok?
Rafael_Guerreiro
Pode testar o menu naquela URL “/sistemas” que você sabia que funcionava.
Se você olhar bem, o menu agora só depende da lista de sistemas.
101574
Brother,
Deve ter alguma coisa errada com o meu código.
Porque continua não funcionando.
So lista, os sistemas na tela dos sistemas.
Acredita?
Rafael_Guerreiro
Debuga e ve se os Sistemas estão devidamente populados na hora em que o DAO faz o listaTudo()
public List<Sistemas> listaTudo() {
return this.session.createCriteria(Sistemas.class).list();
Hibernate.initialize(sistemas.getModulos());
Hibernate.initialize(sistemas.getRotinas());
}
Esta dando erro.
sistemas não pode ser resolvido.
Ixi cara… Você precisa estudar mais um pouquinho…
Não pode ter nada depois do return… Como que o método vai executar o resto se ele já saiu do método?
Eu não vou te entregar tudo na boca. Vou te falar o que fazer:
Colocar o retorno em uma variável separada;
Iterar sobre cada item dessa variável;
Sobre cada item, você aplica o initialize;
E, por último, retornar essa variável.
101574
Caraca que burrice.
Eu nem vi isso.rsrs.
Vou tentar aqui.
Valeu.