Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro ao utilizar o escopo Flash

Olá pessoal, estou tentando utilizar o escopo flash para persistir minhas mensagens na segunda requisição utilizando o código:

context.getExternalContext().getFlash().setKeepMessages(true);

Entretanto, quando erro meu usuário ou senha a mensagem abaixo é exibida no navegador:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:671)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.NullPointerException
    java.lang.String.getBytes(Unknown Source)
    com.sun.faces.util.ByteArrayGuardAESCTR.encrypt(ByteArrayGuardAESCTR.java:124)
    com.sun.faces.context.flash.ELFlash$PreviousNextFlashInfoManager.encode(ELFlash.java:1466)
    com.sun.faces.context.flash.ELFlash.doLastPhaseActions(ELFlash.java:721)
    com.sun.faces.context.flash.ELFlash.doPostPhaseActions(ELFlash.java:645)
    com.sun.faces.context.ExternalContextImpl.doLastPhaseActions(ExternalContextImpl.java:1121)
    com.sun.faces.context.ExternalContextImpl.redirect(ExternalContextImpl.java:656)
    com.sun.faces.application.NavigationHandlerImpl.handleNavigation(NavigationHandlerImpl.java:221)
    com.sun.faces.application.NavigationHandlerImpl.handleNavigation(NavigationHandlerImpl.java:183)
    com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:132)
    javax.faces.component.UICommand.broadcast(UICommand.java:315)
    javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/8.0.29 logs.

Se eu me logar corretamente tudo funciona, se eu tirar a linha "context.getExternalContext().getFlash().setKeepMessages(true);" tudo funciona também. Não estou conseguindo identificar o erro. Alguém poderia me auxiliar? Segue em outro post o xhtml do login e o seu managedbean, respectivamente.

4 respostas
<?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">

<ui:composition template="_template.xhtml">
    <ui:define name="titulo">Login</ui:define>
    <ui:define name="conteudo">

        <h:form id="login">
        <h:messages globalOnly="true" />
            <fieldset>
                <legend>Login</legend>
                <h:panelGrid columns="3">
                    <h:outputLabel value="E-mail:" 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="Login" action="#{loginBean.efetuaLogin}" />
                </h:panelGrid>
            </fieldset>
        </h:form>        
    </ui:define>
    <ui:define name="texto">Login</ui:define>
</ui:composition>

</html>
package br.com.caelum.livraria.bean;

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;
import br.com.caelum.livraria.util.RedirectView;

@ManagedBean
@ViewScoped
public class LoginBean {

    private Usuario usuario = new Usuario();

    public Usuario getUsuario() {
        return usuario;
    }

    public RedirectView efetuaLogin(){
        System.out.println("Fazendo login do usuário " + this.usuario.getEmail());
        UsuarioDao usuarioDao = new UsuarioDao();        
        boolean existeUsuario = usuarioDao.existe(this.usuario);    
        FacesContext context = FacesContext.getCurrentInstance();
        if(existeUsuario){
            context.getExternalContext().getSessionMap().put("usuarioLogado", this.usuario);            
            return new RedirectView("livro");
        }

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

    public RedirectView deslogar(){
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("usuarioLogado");

        return new RedirectView("livro");
    }

}

Segue o erro exibido no eclipse:

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/livraria] threw exception [null] with root cause
java.lang.NullPointerException
    at java.lang.String.getBytes(Unknown Source)
    at com.sun.faces.util.ByteArrayGuardAESCTR.encrypt(ByteArrayGuardAESCTR.java:124)
    at com.sun.faces.context.flash.ELFlash$PreviousNextFlashInfoManager.encode(ELFlash.java:1466)
    at com.sun.faces.context.flash.ELFlash.doLastPhaseActions(ELFlash.java:721)
    at com.sun.faces.context.flash.ELFlash.doPostPhaseActions(ELFlash.java:645)
    at com.sun.faces.context.ExternalContextImpl.doLastPhaseActions(ExternalContextImpl.java:1121)
    at com.sun.faces.context.ExternalContextImpl.redirect(ExternalContextImpl.java:656)
    at com.sun.faces.application.NavigationHandlerImpl.handleNavigation(NavigationHandlerImpl.java:221)
    at com.sun.faces.application.NavigationHandlerImpl.handleNavigation(NavigationHandlerImpl.java:183)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:132)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
solução!

Testei o código em um eclipse em outra máquina e funcionou normalmente. Então, resolvi reinstalar o eclipse na minha máquina e o código passou a funcionar.

Se alguém tiver alguma explicação para isso eu agradeço.

Fala Felipe, tudo bem??

Que bom resolveu o problema! então, provavelmente deu problema alguma config do ecplise ou do tomcat, ou alguma delas estava errada. Mas não é um erro comum e não achei nenhuma literatura explicando o porquê.