Java.lang.IllegalStateException

3 respostas
T

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
<?xml version="1.0" encoding="ISO-8859-1" ?>

<html xmlns="http://www.w3.org/1999/xhtml" 
	  xmlns:h="http://java.sun.com/jsf/html" 
	  xmlns:f="http://java.sun.com/jsf/core"
	  xmlns:p="http://primefaces.org/ui">

<h:head>	<title>Animais</title> </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>
</html>
MeuBeam
@ManagedBean(name="animalBean")
//@SessionScoped
//@RequestScoped
@ViewScoped
public class AnimalBean {
	private Animal animal;
	private List<Animal> 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;
	}
}

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.

3 Respostas

fer.ferreira6

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="animalController") 
@RequestScoped  
public class AnimalController {
  
    FacesContext contexto = FacesContext.getCurrentInstance();  
    FacesMessage mensagem = null;  
      


    @ManagedProperty("#{animalBean}")
    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("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 &gt; 1){  
            mensagem = new FacesMessage("Selecione somente um Animal!");  
        }else{  
            if(qtd &lt;= 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 &lt;= 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&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.

T

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.

fer.ferreira6

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.

Criado 4 de dezembro de 2012
Ultima resposta 5 de dez. de 2012
Respostas 3
Participantes 2