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());
}
}
