Problema com o Session do JSF e SEAM [Resolvido]

6 respostas
Romildo_Paiter

Ola pessoal tudo bem.

Estou com um problema, acho que deve ser simples! Tenho um ManagedBean com escopo de session e tem alguns itens mo Bean vão para a sessão quando criadas e um objeto em especifico que deveria estar indo para a sessão não esta!

Bom vou apresentar meus codigos aqui.

@Synchronized
@Name("loginBean")
@Scope(ScopeType.SESSION)
public class LoginBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private DOMINIO_TIPO_PESSOA tipoPessoa;

    private Long documentoNacional;

    private String password;

    @In
    private FacesMessages facesMessages;

    private boolean loggedIn = false;

    @In(required = false, create = false, scope = ScopeType.SESSION)
    private Cliente cliente;

    @In(required = false, create = true)
    private ClienteDAO clienteDAO;

    // FacesContext context;

    private String documento;
    private String senha;

    // Metodos Internos

    public void validateUser() {

        this.cliente = clienteDAO.loadByField("documentoCadNacional",
                Long.parseLong(this.documento));

        if (this.cliente != null) {

            if (this.cliente.getEstatus().equals(DOMINIO_ATIVO_INATIVO.ATIVO)
                    && this.cliente.getSenha().equals(senha)) {
                loggedIn = true;
                System.out.println("loginSuccess");
                facesMessages.add("Usuario Autenticado");
                // return "loginSuccess";
            } else {
                // context.addMessage(arg0, arg1)
                this.cliente = null;
                System.out.println("loginFail");
                facesMessages.add("Usuario não identificado");
                // return "loginFail";
            }
        } else {
            System.out.println("loginFail");
            facesMessages.add("Usuário Inexistente! Verifique por favor.");
        }

    }

O Dao faz o servico dele normal, autenticando o cliente

E quando eu chamo o por exemplo o treixo abaixo pegando o login do cliente. Ele traz um valor null.

<rich:panel id="pnlAreaLogin"  style="width: 288px;float: right;" styleClass="divClean">
       
        <rich:panel id="pnlDeslogado1" rendered="#{!loginBean.loggedIn}" styleClass="divClean">
                <h:outputText value="Faça seu login!!!" />
        </rich:panel>
       
        <rich:panel id="pnlLogado1" rendered="#{loginBean.loggedIn}" styleClass="divClean">           
            <s:link view="/cadastronotafiscal.xhtml" value="Cadastrar Notas">
                <f:param name="clienteId"
                        value="#{loginBean.cliente.idCliente}"/>
            </s:link>            
        </rich:panel>
    </rich:panel>

E o treixo abaixo recuperara normal os valores inseridos.

<h:panelGrid columns="6" id="pnlLogin">
                                           
                            Documento <s:decorate><h:inputText id="numeroDocumento" maxlength="14" value="#{loginBean.documento}" size="10" required="true" /></s:decorate>
                            Senha: <s:decorate><h:inputSecret id="senhaUsuario" value="#{loginBean.senha}" size="10" required="true" /></s:decorate>
                       
                            <a:commandButton id="btnLogin" value="OK" action="#{loginBean.validateUser}" reRender="pnlLogin, pnlAreaLogin" />
                           
                            <h:messages id="messagesI" styleClass="errorsUL"/>
                       
</h:panelGrid>

Desde já agrade qualquer ajuda;

Valeu pessoal

6 Respostas

alias

Cara, o seu objeto Cliente…é um objeto gerenciado pelo Seam. Repare nesta linha:

@In(required = false, create = false, scope = ScopeType.SESSION)  
private Cliente cliente;

Você está injetando o Cliente que está na sessão nesse atributo do seu objeto “loginBean”. Ocorre que o Seam tentará injetar esse cara a cada invocação do loginBean, e o objeto Cliente da sessão está nulo. Acredito que o problema seja esse.

Como o seu Cliente é instanciado dentro da classe, no retorno do seu dao, acredito que anotar esse atributo com @Out(scope=ScopeType.Session) resolverá o seu problema.

Romildo_Paiter

E ai alias, beleza!

Obrigado pela resposta. Estou estou começando a testa-la agora.

Mas só uma coisa antes.

Quando utilizamos a anotação:

@In(create = true) private Cliente cliente;

Isso não deveria criar todos os outro objetos pertencentes a esse Objeto?

Advertência: javax.el.PropertyNotFoundException: /cadastrocliente.xhtml @106,130 value="#{clienteBean.cliente.endereco.bairro}": Target Unreachable, 'endereco' returned null on 'br.com.domanifiat.stradapremiada.entity.Cliente' javax.faces.FacesException: javax.el.PropertyNotFoundException: /cadastrocliente.xhtml @106,130 value="#{clienteBean.cliente.endereco.bairro}": Target Unreachable, 'endereco' returned null on 'br.com.domanifiat.stradapremiada.entity.Cliente'

O que vc acho que devo fazer, criar uma instancia de endereco e depois setar ela no cliente?

O tem alguma outra solução mais elegante?

Obrigado.

alias

Romildo_Paiter:
E ai alias, beleza!

Obrigado pela resposta. Estou estou começando a testa-la agora.

Mas só uma coisa antes.

Quando utilizamos a anotação:

@In(create = true) private Cliente cliente;

Isso não deveria criar todos os outro objetos pertencentes a esse Objeto?

Advertência: javax.el.PropertyNotFoundException: /cadastrocliente.xhtml @106,130 value="#{clienteBean.cliente.endereco.bairro}": Target Unreachable, 'endereco' returned null on 'br.com.domanifiat.stradapremiada.entity.Cliente' javax.faces.FacesException: javax.el.PropertyNotFoundException: /cadastrocliente.xhtml @106,130 value="#{clienteBean.cliente.endereco.bairro}": Target Unreachable, 'endereco' returned null on 'br.com.domanifiat.stradapremiada.entity.Cliente'

O que vc acho que devo fazer, criar uma instancia de endereco e depois setar ela no cliente?

O tem alguma outra solução mais elegante?

Obrigado.

Na verdade o que será criado é apenas a instancia de Cliente. Os objetos dentro do Cliente QUE NÃO SÃO INJETADOS, ou seja, não tem as anotações do Seam, terão que ser criados por você. Em suma, sim, você teria que criar uma instância de Endereço e setar no Cliente, ou definir um método em Cliente que faça esse comportamento.

E o @Out, funcionou?

Romildo_Paiter

E ai alias, beleza

A solução final para colocar o objeto na sessão foi:

@In(required = false, create = false, scope = ScopeType.SESSION)

@Out(required = false, scope = ScopeType.SESSION)

private Cliente cliente;

Obrigado.

alias

Romildo_Paiter:
E ai alias, beleza

A solução final para colocar o objeto na sessão foi:

@In(required = false, create = false, scope = ScopeType.SESSION)

@Out(required = false, scope = ScopeType.SESSION)

private Cliente cliente;

Obrigado.

Blz, cara…se possivel coloque um RESOLVIDO no título do tópico para que outros colegas que porventura tenham a mesma duvida possam se beneficar.

O mais importante aí é você compreender a anotação @Out que é uma feature muito legal do Seam, que te permite “ejetar” o valor.

Romildo_Paiter

OK

Criado 6 de fevereiro de 2012
Ultima resposta 7 de fev. de 2012
Respostas 6
Participantes 2