Java.lang.IllegalStateException

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.

Não sei se seria o correto, mas você pode fazer é criar um novo ManagedBean com ViewScope para armazenar os dados e outro para mostrar as mensagens e executar as ações com RequestScope, dessa forma:

@ManagedBean(name="animalBean") 
@ViewScoped  
public class AnimalBean {  
    private Animal animal;  
    private List&lt;Animal&gt; animais;  
    private EnumSexo[] sexo;  
    private EnumPorte[] porte;  
    private EnumTipo[] tipo;  
    private UploadArquivo arquivo;  
    private Map&lt;Integer, Boolean&gt; selecionados = new HashMap&lt;Integer, Boolean&gt;();  
  
  
     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&lt;Animal&gt; 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&lt;Integer, Boolean&gt; getSelecionados() {  
        return selecionados;  
    }  
    public void setSelecionados(Map&lt;Integer, Boolean&gt; selecionados) {  
        this.selecionados = selecionados;  
    } 
}  



@ManagedBean(name=&quot;animalController&quot;) 
@RequestScoped  
public class AnimalController {
  
    FacesContext contexto = FacesContext.getCurrentInstance();  
    FacesMessage mensagem = null;  
      


    @ManagedProperty(&quot;#{animalBean}&quot;)
    private AnimalBean animalBean; 
  
    //get e set do animalBean

    //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(&quot;Cadastrado com sucesso!&quot;);  
        contexto.addMessage(null, mensagem);  
        return &quot;ListaAnimais&quot;;  
    }  
  
    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, &quot;/resources/img/&quot;);  
        this.animal.setFoto(this.arquivo.getNome());  
    }  
  
    public String editar(){  
        AnimalRN rn = new AnimalRN();  
        int qtd = rn.qtdRegSelecionados(animais, selecionados);  
        if(qtd &gt; 1){  
            mensagem = new FacesMessage(&quot;Selecione somente um Animal!&quot;);  
        }else{  
            if(qtd &lt;= 0){  
                mensagem =new FacesMessage(&quot;Selecione um Animal!&quot;);  
            }else{  
                this.animal = rn.animal_id(rn.idRegSelecionados(animais, selecionados).get(0));  
                return &quot;NewAnimal&quot;;  
            }  
        }  
        contexto.addMessage(null, mensagem);  
        return null;  
    }  
  
    public String delete(){  
        AnimalRN rn = new AnimalRN();  
        int qtd = rn.qtdRegSelecionados(animais, selecionados);  
        if(qtd &lt;= 0){  
            mensagem = new FacesMessage(&quot;Selecione um Animal!&quot;);  
        }else{  
            rn.delete(animais, selecionados);  
            mensagem = new FacesMessage(&quot;Registro(s) excluído(s) com sucesso!&quot;);  
        }  
        this.animais = null;  
        this.selecionados = new HashMap&lt;Integer, Boolean&gt;();  
        contexto.addMessage(null, mensagem);  
        return null;  
    }  
}  

Ai o que acontece, o animalController acessaria o animalBean e pegaria os valores.
Como o animalBean é viewScope, os dados ficariam lá até você mudar de tela

Ai no animalController, você poderia acessar seus dados da seguinte forma:


this.getAnimalBean().getAnimal().getNome();
this.getAnimalBean().getAnimal().setNome("nome");

Algo do tipo.
Também deixa os ManagedBeans mais organizados, separando por responsabilidades.

fer.ferreira6 ,

Funcionou para problema solicitado, apesar de achar que não seja uma boa prática colocar um scopeView dentro de um scopeRequest, mas ocasionou outro problema, ao mudar para a tela de alterar animal, o objeto perde seus valores.

Você consegue separar seus dados das implementações.
Fica mais claro e limpo.

Usando dessa maneira que te falei, você precisa dar um setAnimal toda vez que um animal for selecionado de alguma lista.