Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

18
respostas

Erro com viewAction

No exercicio eu mudei o meu projeto para o 2.2, e o exercicio pediu para colocar uma "pesquisa" na frente da url. E o meu está dando erro, o mesmo erro que o do instrutor do curso deu, mas ele conseguiu resolver e eu fiz conforme oque ele fez porem ainda estou preso no erro. irei postar o meu código.

Classe autorBean

    private Integer autorId;
    //outros atributos    

    public void carregaPelaId() {
        Integer id = this.autor.getId();
        this.autor = new DAO<Autor>(Autor.class).buscaPorId(id);
        if(this.autor == null) {
            this.autor = new Autor();
        }
    }
    // outros metodos

Meu xhtml autor

<f:metadata>
            <f:param name="autorId" value="#{autorBean.autor.id}"/>
            <f:viewAction action="#{autorBean.carregaPelaId}" if="#{param['autorId'] != null}"/>
        </f:metadata>

Quando coloco o meu

http://localhost:8080/livraria/autor.xhtml?autorId=1

O erro surge

javax.servlet.ServletException: java.lang.IllegalArgumentException: id to load is required for loading
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:671)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Já tentei de outras maneiras mais mesmo assim o erro persiste. Oque estou errando? :(

18 respostas

Já tentou assim:

http://localhost:8080/livraria/autor.xhtml?id=1

Ola Gabriel tentei aqui do seu jeito mais não faz nada :(

Olá Alisson,

Tive um problema parecido uma vez, tente anotar sua classe autorBean com @ViewScoped. Espero que dê certo.

Abs

Fala Rafael minha Classe ja esta com o viewScoped que tenso isso, o erro ta desde a tarde e não consigo resolver :(

Oi Alisson,

Poderia por favor encaminhar seu stack trace completo?

Abs

Ola Rafael aqui está

FASE: RESTORE_VIEW 1
FASE: APPLY_REQUEST_VALUES 2
FASE: PROCESS_VALIDATIONS 3
FASE: UPDATE_MODEL_VALUES 4
FASE: INVOKE_APPLICATION 5
out 12, 2016 4:39:17 PM com.sun.faces.lifecycle.InvokeApplicationPhase execute
ADVERTÊNCIA: #{autorBean.carregaPelaId}: java.lang.IllegalArgumentException: id to load is required for loading
javax.faces.FacesException: #{autorBean.carregaPelaId}: java.lang.IllegalArgumentException: id to load is required for loading
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
    at javax.faces.component.UIViewAction.broadcast(UIViewAction.java:562)
    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:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1082)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
    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)
Caused by: javax.faces.el.EvaluationException: java.lang.IllegalArgumentException: id to load is required for loading
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    ... 27 more
Caused by: java.lang.IllegalArgumentException: id to load is required for loading
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:87)
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:59)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2421)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:974)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:807)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:781)
    at br.com.caelum.livraria.dao.DAO.buscaPorId(DAO.java:67)
    at br.com.caelum.livraria.bean.AutorBean.carregaPelaId(AutorBean.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:279)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:273)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    ... 28 more

out 12, 2016 4:39:17 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/livraria] threw exception [java.lang.IllegalArgumentException: id to load is required for loading] with root cause
java.lang.IllegalArgumentException: id to load is required for loading
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:87)
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:59)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2421)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:974)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:807)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:781)
    at br.com.caelum.livraria.dao.DAO.buscaPorId(DAO.java:67)
    at br.com.caelum.livraria.bean.AutorBean.carregaPelaId(AutorBean.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:279)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:273)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    at javax.faces.component.UIViewAction.broadcast(UIViewAction.java:562)
    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:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1082)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
    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)

Oi Alisson,

Acredito que o problema esteja nessa linha:

if="#{param['autorId'] != null}

Tente trocar por:

if="#{param.autorId != null}

Espero que funcione!

Abs

Rafael ja testei desse jeito também e nao sai do erro, ainda estou preso aqui, não sei deixo de "lado" e continuo no curso ou espero para achar a solução

Oi Alisson,

Sua classe autorBean tem esse método?

public void setAutorId(Integer autorId) {
        this.autorId = autorId;
    }

Oi Rafael sim sim tem todos os getters e setters necessarios, quer que eu posto tudo aqui? e Rafael obrigado por me ajudar cara.

package br.com.caelum.livraria.bean;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.caelum.livraria.dao.DAO;
import br.com.caelum.livraria.modelo.Autor;

@ManagedBean
@ViewScoped
public class AutorBean {

    private Autor autor = new Autor();
    private Integer autorId;


    public Integer getAutorId() {
        return autorId;
    }
    public void setAutorId(Integer autorId) {
        this.autorId = autorId;
    }

    public Autor getAutor() {
        return autor;
    }

    public void setAutor(Autor autor) {
        this.autor = autor;
    }

    public void carregaPelaId() {
        Integer id = this.autor.getId();
        this.autor = new DAO<Autor>(Autor.class).buscaPorId(id);
        if(this.autor == null) {
            this.autor = new Autor();
        }
    }

    public String gravar() {
        if(autor.getId() == null) {
            System.out.println("Gravando autor " + this.autor.getNome());
            new DAO<Autor>(Autor.class).adiciona(this.autor);
        } else {
            new DAO<Autor>(Autor.class).atualiza(this.autor);
        }
        this.autor = new Autor();
        return "livro?faces-redirect=true";
    } 

    public List<Autor> getAutores() {
        return new DAO<Autor>(Autor.class).listaTodos();
    }

    public void removeAutor(Autor autor) {
        System.out.println("Removendo autor");
        new DAO<Autor>(Autor.class).remove(autor);
    }


 }
package br.com.caelum.livraria.modelo;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Autor implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String nome;

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

}
<?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">
        <f:metadata>
            <f:param name="autorId" value="#{autorBean.autor.id}"/>
            <f:viewAction action="#{autorBean.carregaPelaId}" if="#{param.autorId != null}"/>
        </f:metadata>

        <ui:define name="titulo">
            Novo Autor
        </ui:define>
        <ui:define name="conteudo">
            <h:form id="autor">
            <fieldset>
                <legend>Dados do Autor</legend>
                <h:panelGrid columns="3">
                    <h:outputLabel value="Nome:" for="nome" />
                    <h:inputText id="nome" value="#{autorBean.autor.nome}" required="true">
                        <f:validateLength minimum="5" />
                        <f:ajax event="blur" render="messageNome" />
                    </h:inputText>
                    <h:message for="nome" id="messageNome"/>
                    <h:commandButton value="Gravar" action="#{autorBean.gravar}"/>
                </h:panelGrid>
            </fieldset>
        </h:form>

        <h:form id="formularioAutor">
            <h:dataTable id="tabelaFuncionarios" value="#{autorBean.autores}" var="autor">
                <h:column>
                    <f:facet name="header">Nome</f:facet>
                    <h:outputText value="#{autor.nome}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">Excluir</f:facet>
                    <h:commandLink value="excluir" action="#{autorBean.removeAutor(autor)}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">Alterar</f:facet>
                    <h:commandLink value="alterar">
                        <f:setPropertyActionListener value="#{autor}" target="#{autorBean.autor}"></f:setPropertyActionListener>
                    </h:commandLink>
                </h:column>

            </h:dataTable>
        </h:form>
        </ui:define>
    </ui:composition>
</html>

Oi Alisson,

Você conseguiria fazer upload do seu projeto no github e me passar o link para que eu possa fazer download do seu código?

Rafael eu nunca utilizei o github, o meu proximo curso seria o próprio :(

Oi Alisson,

Vamos fazer o seguinte, no próximo capítulo do curso tem o projeto para download, sugiro fazer o download do projeto, importar para o eclipse e trabalhar com ele, porque ele vai estar com as alterações feitas no vídeo e estará funcionando. Sugiro em seguida comparar o seu código com o do download, acredito que assim será possível ver a diferença :)

Correto Rafael muito obrigado

Infelizmente estou com o mesmo problema... Vou acabar optando por seguir adiante mesmo assim!

Odilon eu fiz o mesmo, segue adiante, não perde tempo, porque não consegui ainda achar a solução

Na classe autor você está utilizando autorId como atributo:

private Integer autorId;

Já no método da própria classe e no xhtml você utiliza somente id:

public void carregaPelaId() {
        Integer id = this.autor.getId();
        this.autor = new DAO<Autor>(Autor.class).buscaPorId(id);
        if(this.autor == null) {
            this.autor = new Autor();
        }
    }
<f:metadata>
            <f:param name="autorId" value="#{autorBean.autor.id}"/>
            <f:viewAction action="#{autorBean.carregaPelaId}" if="#{param['autorId'] != null}"/>
        </f:metadata>

Acerta essas variáveis todas para autorId e no método carregaPelaId (nome que você utilizou), basta uma única linha:

public void carregaPelaId() {
        this.autor = new DAO<Autor>(Autor.class).buscaPorId(autorId);
    }