É normal os métodos get do mb serem chamados antes de uma action?
Isto está acontecendo em um projeto meu.
O problema é que como os getters são chamados antes, os resultados estão vindo errados…
Vc deve esta usando imediate=true no action. Faça um teste retirando esta opção.
Se não me engano, a action é a ultima coisa a ser chamada.
Primeiro ele chama get/set para depois você utilizar a action.
Com isso na sua action vc tem a certeza de que todos os objetos estão corretamente populados.
Deve ter alguma coisa errada em sua lógica. [=
posta seu bean e o xhtml para a gente ver
Claro…
A demora foi devido ao fato do esforço de achar uma solução
Cheguei ao ponto de chamar forçado o método do actionListener no meu get…
public List<Categoria> getCategorias() {
if (categorias.size() == 0)
carregarCategorias(null);
return categorias;
}
Funcionou. mas não estou satisfeito com este resultado…
Pois bem, antes da modificação estava assim …
Meu avaliacoes.xhtml:
<h:form>
<div id="menu_esquerda">
<h:dataTable value="#{categoriaMB.categorias}" var="categoria">
<h:column>
<h:commandLink value="#{categoria.nome}" action="#{categoriaMB.carregarCategorias}"
rendered="#{categoria.aprovada}">
<f:param value="#{categoria.id}" name="id"></f:param>
</h:commandLink>
</h:column>
</h:dataTable>
</div>
</h:form>
e meu bean…
public String carregarCategorias() {
int id = 0;
Session sessao = HibernateUtils.getSession();
try {
id = Integer.parseInt(FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap().get("id"));
} catch (Exception e) {
e.printStackTrace();
}
categoria = new CategoriaDao(sessao, id).getCategoria();
categorias = new CategoriaDao(sessao, categoria).getListByName();
sessao.close();
if(categoria.last)
return "final"
return "avaliacoes";
}
public List<Categoria> getCategorias() {
return categorias;
}
Então… apareceu este erro novamente…
Não estou entendendo o que estou fazendo errado…
Aqui está meu template.xhtml
<h:form>
<div id="login">
<div id="login_campos">
<h:outputText value="Login:" rendered="#{!usuarioMB.logado}"></h:outputText>
<p:inputText value="#{usuarioMB.usuario.login}"
rendered="#{!usuarioMB.logado}"></p:inputText>
<h:outputText value="Senha:" rendered="#{!usuarioMB.logado}"></h:outputText>
<p:password feedback="false" minLength="4"
value="#{usuarioMB.usuario.senha}" rendered="#{!usuarioMB.logado}"></p:password>
<h:outputText value=" | " rendered="#{usuarioMB.usuario.admin}"></h:outputText>
<h:commandLink value="Categorias e Pontos Recentes"
rendered="#{usuarioMB.usuario.admin}" action="addel/recent"></h:commandLink>
<h:outputText value=" | " rendered="#{usuarioMB.usuario.admin}"></h:outputText>
<h:commandLink value="Gerenciar Categorias"
rendered="#{usuarioMB.usuario.admin}"></h:commandLink>
<h:outputText value=" | " rendered="#{usuarioMB.usuario.admin}"></h:outputText>
<h:outputText value=" | " rendered="#{usuarioMB.usuario.admin}"></h:outputText>
</div>
<div id="login_button">
<p:commandButton value="Entrar" action="#{usuarioMB.login}"
rendered="#{!usuarioMB.logado}" update="top"></p:commandButton>
</div>
<div id="login_conta">
<h:outputText value="Não possui uma conta?"
rendered="#{!usuarioMB.logado}"></h:outputText>
<h:commandLink value="Registre-se aqui"
rendered="#{!usuarioMB.logado}"></h:commandLink>
<h:outputText value="Bem-vindo " rendered="#{usuarioMB.logado}"></h:outputText>
<h:outputText value="#{usuarioMB.usuario.login}, "
rendered="#{usuarioMB.logado}"></h:outputText>
<h:commandLink value="Sair" action="#{usuarioMB.logout}"
rendered="#{usuarioMB.logado}"></h:commandLink>
</div>
</div>
</h:form>
e aqui meu request bean
import model.Usuario;
public class UsuarioMB {
private Usuario usuario = new Usuario();
private List<Usuario> usuarios = new ArrayList<Usuario>();
private boolean logado = false;
public Usuario getUsuario() {
usuario = (Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
public List<Usuario> getUsuarios() {
return usuarios;
}
public void setUsuarios(List<Usuario> usuarios) {
this.usuarios = usuarios;
}
public boolean isLogado() {
usuario = (Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
if(usuario != null)
return true;
return logado;
}
public void setLogado(boolean logado) {
this.logado = logado;
}
public String login(){
Session sessao = HibernateUtils.getSession();
usuario = new UsuarioDao(sessao, usuario.getLogin(), usuario.getSenha()).getUsuario();
if(usuario != null){
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuario",usuario);
}
sessao.close();
return null;
}
public String logout(){
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove(usuario);
usuario = null;
return "main";
}
}
O erro acontece quando chamo a action ="#{usuarioMB.login}". Ele passa pelo getUsuario e retorna null… nem chega a entrar no método login()
javax.el.PropertyNotFoundException: /view/template.xhtml @56,39 value="#{usuarioMB.usuario.login}": Target Unreachable, 'usuario' returned null
Não sei o que pode ser…