Boa Tarde,
Pessoal estou com um problema que não estou conseguindo resolver,
tenho um crud que só aparece as mensagens() se tiver com @RequestScope,
se utilizar qualquer outro tipo de sessão ele gera o java.lang.IllegalStateException, segue abaixo meu código:
Página.xhtml
[code]<?xml version="1.0" encoding="ISO-8859-1" ?>
<h:head> Animais </h:head>
<h:body>
<h:form id="pesquisa">
<p:fieldset>
<h:panelGrid columns="2">
<h:outputText value="Animal:" for="animal"/>
<h:inputText id="animal" value="#{animalBean.animal.nome}" onkeyup="#{animalBean.filtraLista()}">
<f:ajax execute="@form" render=":lista" event="keyup"/>
</h:inputText>
</h:panelGrid>
</p:fieldset>
</h:form>
<h:form id="lista">
<h:messages />
<h:dataTable id="tabela" value="#{animalBean.animais}" var="animal" rules="rows" cellpadding="5"
rowClasses="primeiro,ultimo" headerClass="cabecalho" styleClass="tabela" >
<f:facet name="footer">
<h:commandLink action="NewAnimal">
<h:graphicImage library="img" name="novo.png" style="border:0"/>
</h:commandLink>
<p:spacer width="20"/>
<h:commandLink action="#{animalBean.editar()}">
<h:graphicImage library="img" name="alterar.png" style="border:0"/>
</h:commandLink>
<p:spacer width="20"/>
<h:commandLink action="#{animalBean.delete()}">
<h:graphicImage library="img" name="excluir.png" style="border:0"/>
</h:commandLink>
</f:facet>
<h:column>
<f:facet name="header">SELECIONE</f:facet>
<h:selectBooleanCheckbox id="check" value="#{animalBean.selecionados[animal.id_animal]}"/>
</h:column>
<h:column>
<f:facet name="header">NOME</f:facet>
<h:outputLabel value="#{animal.nome}" style="text-align:right; display:block;"/>
</h:column>
<h:column>
<f:facet name="header">SEXO</f:facet>
<h:outputLabel value="#{animal.sexo == 'M'?'Masculino':'Feminino'}" style="text-align:center; display:block;"/>
</h:column>
</h:dataTable>
</h:form>
</h:body>
[/code]MeuBeam
[code]@ManagedBean(name=“animalBean”)
//@SessionScoped
//@RequestScoped
@ViewScoped
public class AnimalBean {
private Animal animal;
private List animais;
private EnumSexo[] sexo;
private EnumPorte[] porte;
private EnumTipo[] tipo;
private UploadArquivo arquivo;
private Map<Integer, Boolean> selecionados = new HashMap<Integer, Boolean>();
FacesContext contexto = FacesContext.getCurrentInstance();
FacesMessage mensagem = null;
public AnimalBean() {
this.animal = new Animal();
this.arquivo = new UploadArquivo();
}
public Animal getAnimal() {
return animal;
}
public void setAnimal(Animal animal) {
this.animal = animal;
}
public List<Animal> getAnimais() {
if(this.animais == null){
AnimalRN rn = new AnimalRN();
this.animais = rn.listar(null);//com o parametro null, a lista carrega todos os registros
}
return this.animais;
}
public EnumSexo[] getSexo() {
this.sexo = EnumSexo.values();
return this.sexo;
}
public EnumPorte[] getPorte(){
this.porte = EnumPorte.values();
return this.porte;
}
public EnumTipo[] getTipo(){
this.tipo=EnumTipo.values();
return this.tipo;
}
public Map<Integer, Boolean> getSelecionados() {
return selecionados;
}
public void setSelecionados(Map<Integer, Boolean> selecionados) {
this.selecionados = selecionados;
}
//Actions
public String salvar(){
AnimalRN animalrn = new AnimalRN();
animalrn.salvar(this.animal);
//a linha abaixo serve para salvar a imagem no servidor
this.arquivo.gravar();
//as linhas abaixo servem para instaciar um novo objeto;
this.animal = new Animal();
this.arquivo = new UploadArquivo();
mensagem = new FacesMessage("Cadastrado com sucesso!");
contexto.addMessage(null, mensagem);
return "ListaAnimais";
}
public String filtraLista(){
AnimalRN rn = new AnimalRN();
this.animais = rn.listar(this.animal.getNome());//com o parametro this.animal, o sistema carrega a lista filtrada
return null;
}
public void uploadAction (FileUploadEvent event){
this.arquivo.fileUpload(event, "/resources/img/");
this.animal.setFoto(this.arquivo.getNome());
}
public String editar(){
AnimalRN rn = new AnimalRN();
int qtd = rn.qtdRegSelecionados(animais, selecionados);
if(qtd > 1){
mensagem = new FacesMessage("Selecione somente um Animal!");
}else{
if(qtd <= 0){
mensagem =new FacesMessage("Selecione um Animal!");
}else{
this.animal = rn.animal_id(rn.idRegSelecionados(animais, selecionados).get(0));
return "NewAnimal";
}
}
contexto.addMessage(null, mensagem);
return null;
}
public String delete(){
AnimalRN rn = new AnimalRN();
int qtd = rn.qtdRegSelecionados(animais, selecionados);
if(qtd <= 0){
mensagem = new FacesMessage("Selecione um Animal!");
}else{
rn.delete(animais, selecionados);
mensagem = new FacesMessage("Registro(s) excluído(s) com sucesso!");
}
this.animais = null;
this.selecionados = new HashMap<Integer, Boolean>();
contexto.addMessage(null, mensagem);
return null;
}
}[/code]
Caso alterar um registro sem selecionar um checkBox ele deveria lançar uma mensagem,
porém só funciona se o escopo de sessão estiver como request,
porém se utilizar o scopo como requeste o componente fileupload não funciona,
qualquer ajuda é bem vinda.