5
respostas

Erro com java.lang.IllegalStateException: Cannot call sendRedirect()

Senhores,

Eu apliquei o mesmo código indicado em: public String deslogar() {...} Ao fazê-lo eu tive o erro java.lang.IllegalStateException: Cannot call sendRedirect(). Pesquisei em fórum e a solução que eu vi foi mudar o método para:

 public void deslogar() {

        FacesContext context = FacesContext.getCurrentInstance();
        context.getExternalContext().getSessionMap().remove("usuarioLogado");

        //return "login?faces-redirect=true";
    }

Dessa maneira o programa passou a funcionar normalmente.

Gostaria de saber se eu estou no caminho certo ou esqueci algo, por isso do erro visto... todo meu código está fiel ao desenvolvido no curso.

No aguardo,

Marcelo

5 respostas

Oi Marcelo,

Poderia postar o código inteiro do seu ManagedBean?

Abraço!

Olá Joviane

Obrigado pela pronta atenção.

Segue código :

package br.com.caelum.livraria.bean;

import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.caelum.livraria.dao.UsuarioDAO;
import br.com.caelum.livraria.modelo.Usuario;

@ViewScoped
@ManagedBean
public class LoginBean implements Serializable{

    private static final long serialVersionUID = 2918136537536147685L;

    private Usuario usuario = new Usuario();

    public Usuario getUsuario() {
        return usuario;
    }

    public String efetuaLogin() {
        System.out.println("Fazendo login do usuário "
                + this.usuario.getEmail());

        FacesContext context = FacesContext.getCurrentInstance();

        boolean existe = new UsuarioDAO().existe(this.usuario);

        if (existe) {
            context.getExternalContext().getSessionMap()
                    .put("usuarioLogado", this.usuario);

            return "livro?faces-redirect=true";
        }

        context.getExternalContext().getFlash().setKeepMessages(true);
        context.addMessage(null, new FacesMessage("Usuário não encontrado"));

        return "login?faces-redirect=true";        
    }    

    public void deslogar() {

        FacesContext context = FacesContext.getCurrentInstance();
        context.getExternalContext().getSessionMap().remove("usuarioLogado");

        //return "login?faces-redirect=true";
    }

}

Adicionando também o .xhtml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

    <ui:composition template="_template.xhtml">

        <ui:define name="titulo">
                Login
        </ui:define>

        <ui:define name="conteudo">

            <h:messages globalOnly="true" />

            <h:form id="login">
                <fieldset>
                    <legend>Login</legend>
                    <h:panelGrid columns="3">

                        <h:outputLabel value="Email:" for="email" />
                        <h:inputText id="email" value="#{loginBean.usuario.email}"
                            required="true">
                            <f:passThroughAttribute name="type" value="email" />
                        </h:inputText>

                        <h:message for="email" id="messageEmail" />

                        <h:outputLabel value="Senha:" for="senha" />
                        <h:inputSecret id="senha" value="#{loginBean.usuario.senha}"
                            required="true"/>

                        <h:message for="senha" id="messageSenha" />

                        <h:commandButton value="Efetuar Login" 
                            action="#{loginBean.efetuaLogin}" />
                    </h:panelGrid>
                </fieldset>
            </h:form>
        </ui:define>
    </ui:composition>
</html>
{
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

    <ui:composition template="_template.xhtml">

        <ui:define name="titulo">
                Login
        </ui:define>

        <ui:define name="conteudo">

            <h:messages globalOnly="true" />

            <h:form id="login">
                <fieldset>
                    <legend>Login</legend>
                    <h:panelGrid columns="3">

                        <h:outputLabel value="Email:" for="email" />
                        <h:inputText id="email" value="#{loginBean.usuario.email}"
                            required="true">
                            <f:passThroughAttribute name="type" value="email" />
                        </h:inputText>

                        <h:message for="email" id="messageEmail" />

                        <h:outputLabel value="Senha:" for="senha" />
                        <h:inputSecret id="senha" value="#{loginBean.usuario.senha}"
                            required="true"/>

                        <h:message for="senha" id="messageSenha" />

                        <h:commandButton value="Efetuar Login" 
                            action="#{loginBean.efetuaLogin}" />
                    </h:panelGrid>
                </fieldset>
            </h:form>
        </ui:define>
    </ui:composition>
</html>
}

Estou com o mesmo problema.