Olá pessoal, eu estou estudando JSF e estou com algumas dificuldades. Eu li algumas referências de JSF, mas não encontrei nada falando a respeito do comportamento dos componentes (agradeço quem indicar alguma referência).
Pois bem, meu problema está na submissão de um formulário que contém uma combobox (selectOneMenu), utilizando o escopo “request”.
Na hora da submissão, o JSF tenta recarregar novamente o combobox (pra quê?), mas os atributos estão null, então dá um erro pois minha lista é conseguida através de outro componente. Na entrada não dá erro, pois a página que submeteu envia esse atributo, e por isso consigo capturar a lista.
Consigo resolver esse problema utilizando o escopo “session” ou manualmente fazer o controle de exibição com a propriedade “rendered”, mas não queria fazer destes modos pois acho que tem uma maneira mais fácil de fazer. Quero saber mesmo é o por quê a página tenta preencher novamente o combobox já que estou saindo dela e o mesmo não irá ser exibido.
abaixo está trechos do meu código para facilitar o entendimento, qualquer dúvida e esclarecimentos, é só perguntar.
Página JSP que irá ser exibido o combo
<h:inputHidden value="#{inscricao.concursoID}" />
<h:selectOneMenu value="#{inscricao.cargoID}" rendered="true">
<f:selectItems value="#{inscricao.cargos}" />
</h:selectOneMenu>
<h:commandButton action="#{inscricao.cadastrar}" value="Salvar Dados" />
Métodos e atributos do meu bean
private Integer concursoID;
private Integer cargoID;
private Concurso concurso;
public Concurso getConcurso() {
if (concurso == null) {
Fachada fachada = Fachada.getInstance();
concurso = fachada.findConcursoById(concursoID);
}
return concurso;
}
public List<SelectItem> getCargos() {
Concurso concurso = getConcurso();
if (concurso != null) {
return concurso.getCargos();
} else {
return new ArrayList<SelectItem>(); //Lista vazia
}
}
public String cadastrar() {
try {
Fachada fachada = Fachada.getInstance();
Concurso concurso = getConcurso();
Cargo cargo = fachada.findCargoById(cargoID)
Inscricao i = new Inscricao();
i.setCargo(cargo);
i.setConcurso(concurso);
fachada.saveInscricao(i);
} catch (PersistenceException e) {
return "fail";
}
return "sucess";
}
// get e set para concursoID e cargoID...
faces-config.xml
<managed-bean>
<managed-bean-name>inscricao</managed-bean-name>
<managed-bean-class>action.InscricaoAction</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>