Getters em JSF antes da action, isso é normal? = Erro

É 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…