Request Scoped perdendo objeto

Olá, estou iniciando na área de JSF e td mais. E já estou travado em um problema que creio que seja simples de resolver, porém estou fritando neurônios e judiando do Google há semanas já e nada de encontrar uma solução.
É o seguinte: tenho um crud simples. Tenho um bean no escopo de requisição. Preencho os campos do formulário e clico em salvar, neste momento ele tenta persistir um objeto nullo. Debugando o projeto percebi que na última parte do cliclo ele seta o objeto do meu bean para null, no qual este ja estava preenchido com os valores do meu formulário.
Na mesma página esta o formulário e o DataTable, já coloquei ambos em forms diferentes e ai ele persiste normalmente. Consigo setar o objeto por meio do onRowSelect do DataTable, mas na hora de clicar no botao remover, é feita uma nova requisição perdendo o objeto anterior e preenchendo-o com os dados do formulário. Desta forma não remove pois perdeu o id.
Meio confuso, mas é o que ta acontecendo.

No index esta assim:

            <p:layoutUnit position="center" styleClass="ui-layout-unit-content">
                <p:outputPanel id="pnlPrincipal">
                    <h:form id="formPrincipal">
                        <ui:include src="#{beanNavegacao.pagina}"/>
                    </h:form>
                </p:outputPanel>
            </p:layoutUnit>

Meu crud xhtml

<p:panel header="Cadastro de Seleções" toggleable="true" id="pnlCad">
        <p:panelGrid columns="2" id="pnlCrud">
            <p:outputLabel for="campo-pais" value="Pais:"/>
            <p:inputText id="campo-pais" value="#{beanSelecao.s.pais}" required="true"/>

            <p:outputLabel for="campo-tecnico" value="Técnico: "/>
            <p:inputText id="campo-tecnico" value="#{beanSelecao.s.tecnico}" required="true"/>
        </p:panelGrid>
        <p:toolbar>
            <p:toolbarGroup id="crud" align="left">
                <p:commandButton
                    id="btNewSelecao"
                    icon="ui-icon-new"
                    value="Novo"
                    update="@form"             
                    actionListener="#{beanSelecao.novaSelecao()}"/>
                <p:commandButton
                    id="btAddSelecao"
                    icon="ui-icon-confirm"
                    value="Salvar"
                    update="@form"             
                    actionListener="#{beanSelecao.adiciona()}"/>                        
                <p:commandButton
                    id="btDelSelecao"
                    icon="ui-icon-delete"
                    value="Remover"
                    update="@form"
                    actionListener="#{beanSelecao.remove()}"/>
            </p:toolbarGroup>
        </p:toolbar>
    </p:panel>

    <br/>
    <p:panel header="Listagem de Seleções" id="pnlListagem" toggleable="true">
        <p:dataTable
            id="dtSelecoes"
            var="selecao"
            value="#{beanSelecao.lsSelecao}"
            emptyMessage="Sem registros a listar."
            rowKey="#{selecao.id}"
            selection="#{beanSelecao.s}"
            selectionMode="single"
            paginator="true"
            rows="5">

            <p:ajax event="rowSelect" update="@form"/>

            <p:column headerText="Id" style="width: 20%; alignment-adjust: central">
                #{selecao.id}
            </p:column>
            <p:column headerText="Seleção" style="width: 40%">
                #{selecao.pais}
            </p:column>
            <p:column headerText="Técnico" style="width: 40%">
                #{selecao.tecnico}
            </p:column>
        </p:dataTable>
    </p:panel>

Meu Bean

@Named
@RequestScoped
public class BeanSelecao {

    private Selecao s;
    @Inject
    private SelecaoFacade facade;
    private List<Selecao> lsSelecao = new ArrayList<Selecao>();

    public Selecao getS() {
        if (s == null) {
            s = new Selecao();
        }
        return s;
    }

    public void setS(Selecao s) {
        this.s = s;
    }
    
    public List<Selecao> getLsSelecao() {
        lsSelecao.clear();
        lsSelecao = facade.findAll();
        return lsSelecao;
    }

    public void adiciona() {
        if (getS().getId() == null) {
            facade.create(s);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Salvo com Sucesso!", null));
        } else {
            facade.edit(s);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Editado com Sucesso!", null));
        }
    }

    public void remove() {
        if (getS().getId() == null) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Nenhuma seleção selecionada!", null));
        } else {
            facade.remove(s);
            facade.removeJogador(s);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Seleção e jogadoes removidos com Sucesso!", null));
        }
    }

    public void novaSelecao() {
        setS(new Selecao());
    }
    
    public void onRowSelect(SelectEvent event) {
        setS((Selecao) event.getObject());
    }
}

Vc sabe como funciona o request scope? Que a cada chamada de ajax ele perde o estado ao finalizar a chamada?

Acho melhor voce dar uma pesquisada sobre o escopos disponiveis e como eles funcionam…

Aqui mostra: JSF Mini Livro - Dicas, conceitos e boas práticas.

Vou analisar o artigo aqui. Obrigado pelas dicas! :slight_smile:

Entendi o funcionamento do escopo. Mas me surgiu um questionamento. Quando o formulário e o DataTable estão dentro do mesmo Form, o estado do objeto é mantido. Ou seja, quando ambos estão no mesmo form e disparo o evento onRowSelect do DataTable ele altera o estado do objeto e ao disparar o actionListener do botão remover ele continua com o estado anterior do objeto. Porém acontece que quando vou persistir um item, debugando, percebi que ele preenche o objeto com os dados do formulário e antes de ir para o método de persistir do bean ele seta um objeto null.
Mas em todo caso, um inputhidden resolveria meu problema?

[quote=frankwrs]Entendi o funcionamento do escopo. Mas me surgiu um questionamento. Quando o formulário e o DataTable estão dentro do mesmo Form, o estado do objeto é mantido. Ou seja, quando ambos estão no mesmo form e disparo o evento onRowSelect do DataTable ele altera o estado do objeto e ao disparar o actionListener do botão remover ele continua com o estado anterior do objeto. Porém acontece que quando vou persistir um item, debugando, percebi que ele preenche o objeto com os dados do formulário e antes de ir para o método de persistir do bean ele seta um objeto null.
Mas em todo caso, um inputhidden resolveria meu problema?[/quote]Você testou? Qual foi o resultado?

Testei anteriormente e constatei que o escopo de requisição perdia o estado do objeto a cada evento ajax. Adicionei um inputhidden para o ID do objeto e funcionou como eu queria. Agora ele identifica corretamente o objeto.
Obrigado!