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

Exception: java.lang.IllegalArgumentException: id to load is required for loading

Vi outras perguntas sobre este erro, mas nenhuma delas estava com o código correto. Já conferi um milhão de vezes e não consigo descobrir o que está errado. Vi em uma das perguntas sobre chegar null em autorId em gravarAutor. Como corrigir este erro e a partir da página setar o valor de autorId antes de chamar o DAO?

package br.com.caelum.livraria.bean;

import java.util.List;

import javax.faces.bean.ManagedBean;

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

@ManagedBean
public class LivroBean {

    private Livro livro = new Livro();
    private Integer autorId;

    public Integer getAutorId() {
        System.out.println("Entrou no getAutorId ==> Id = " + autorId);
        return autorId;
    }

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

    public Livro getLivro() {
        return livro;
    }

    public void gravar() {
        System.out.println("Gravando livro " + this.livro.getTitulo());

        if (livro.getAutores().isEmpty()) {
            throw new RuntimeException("Livro deve ter pelo menos um Autor.");
        }

        new DAO<Livro>(Livro.class).adiciona(this.livro);
    }

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

    public void gravarAutor() {
        System.out.println("Entrou em gravarAutor");
        Autor autor = new DAO<Autor>(Autor.class).buscaPorId(this.autorId);
        System.out.println("Autor.id = " + autor.getId() + "  " + autor.getNome());
        this.livro.adicionaAutor(autor);
    }
}
<?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://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    >

<h:body>
    <h1>Novo Livro</h1>
    <h:form>
        <fieldset>
            <legend>Dados do Livro</legend>
            <h:panelGrid columns="2">

                <h:outputLabel value="Titulo:" for="titulo" />
                <h:inputText id="titulo" value="#{livroBean.livro.titulo}" />

                <h:outputLabel value="ISBN:" for="isbn" />
                <h:inputText id="isbn" value="#{livroBean.livro.isbn}" />

                <h:outputLabel value="Preço:" for="preco" />
                <h:inputText id="preco" value="#{livroBean.livro.preco}" />

                <h:outputLabel value="Data de Lançamento:" for="dataLancamento" />
                <h:inputText id="dataLancamento"
                    value="#{livroBean.livro.dataLancamento}" />

            </h:panelGrid>
        </fieldset>
        <fieldset>
            <legend>Dados do Autor</legend>
            <h:outputLabel value="Selecione Autor:" for="autor" />
            <h:selectOneMenu value="{#livroBean.autorId}" id="autor">
                <f:selectItems value="#{livroBean.autores}" var="autor"
                     itemLabel="#{autor.nome}" itemValue="#{autor.id}">
                </f:selectItems>
            </h:selectOneMenu> 

            <h:commandButton value="Gravar Autor" action="#{livroBean.gravarAutor}"/>
        </fieldset>
        <h:commandButton value="Gravar" action="#{livroBean.gravar}" />
    </h:form>
</h:body>

</html>
4 respostas

Segue o banco de dados

mysql> use livrariadb;
Database changed
mysql> show tables;
+----------------------+
| Tables_in_livrariadb |
+----------------------+
| autor                |
| livro                |
| livro_autor          |
+----------------------+
3 rows in set (0.00 sec)

mysql> select * from autor;
+----+--------------------+
| id | nome               |
+----+--------------------+
|  1 | Machado de Assis   |
|  2 | Jorge Amado        |
|  3 | Paulo Coelho       |
|  4 | Monteiro Lobato    |
|  5 | Kanehman           |
|  6 | Clarice Linspector |
+----+--------------------+
6 rows in set (0.00 sec)

mysql> select * from livro;
+----+----------------+-------------------+-------+---------------------------------+
| id | dataLancamento | isbn              | preco | titulo                          |
+----+----------------+-------------------+-------+---------------------------------+
|  1 | 10/01/1899     | 978-8-52-504464-8 |  24.9 | Dom Casmurro                    |
|  2 | 01/01/1881     | 978-8-50-815415-9 |  19.9 | Memorias Postumas de Bras Cubas |
|  3 | 01/01/1891     | 978-8-50-804084-1 |  16.9 | Quincas Borba                   |
|  4 | 01/01/1988     | 978-8-57-542758-3 |  19.9 | O Alquimista                    |
|  5 | 01/01/1990     | 978-8-50-567258-7 |  12.9 | Brida                           |
|  6 | 01/01/1992     | 978-8-52-812458-8 |  29.9 | As Valkirias                    |
|  7 | 01/01/1987     | 978-8-51-892238-9 |   9.9 | O Diario de um Mago             |
|  8 | 01/01/1937     | 978-8-50-831169-1 |   6.9 | Capitaes da Areia               |
|  9 | 01/01/1966     | 978-8-53-592569-9 |  18.9 | Dona Flor e Seus Dois Maridos   |
+----+----------------+-------------------+-------+---------------------------------+
9 rows in set (0.01 sec)

mysql> select * from livro_autor;
+----------+------------+
| Livro_id | autores_id |
+----------+------------+
|        1 |          1 |
|        2 |          1 |
|        3 |          1 |
|        4 |          3 |
|        5 |          3 |
|        6 |          3 |
|        7 |          3 |
|        8 |          2 |
|        9 |          2 |
+----------+------------+
9 rows in set (0.02 sec)

mysql>

Segue saída do console

Hibernate: select autor0_.id as id1_, autor0_.nome as nome1_ from Autor autor0_
Hibernate: select autor0_.id as id1_, autor0_.nome as nome1_ from Autor autor0_
Entrou em gravarAutor
Out 01, 2018 5:30:07 PM com.sun.faces.lifecycle.InvokeApplicationPhase execute
ADVERTÊNCIA: #{livroBean.gravarAutor}: java.lang.IllegalArgumentException: id to load is required for loading
javax.faces.FacesException: #{livroBean.gravarAutor}: java.lang.IllegalArgumentException: id to load is required for loading
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:117)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:791)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1256)
    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:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1152)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
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:101)
    ... 28 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.LivroBean.gravarAutor(LivroBean.java:46)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    ... 29 more



solução!

Oi Leonardo, tudo bem?

O problema está nessa linha:

<h:selectOneMenu value="{#livroBean.autorId}" id="autor">

O correto é:

<h:selectOneMenu value="#{livroBean.autorId}" id="autor">

Abraço!

Obrigado. Era isso mesmo.