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);
    }