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

Estou com dúvida no curso de JSF 2: simplicidade e produtividade na Web, no exercício do capítulo Completando o sistema e lidando com escopos do JSF 2.

Autor(es)

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; import br.com.caelum.livraria.modelo.Livro;

@ManagedBean(name="livroBean") @ViewScoped public class LivroBean {

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

public Long getAutorId() { if ( autorId==null ){ autorId = (long) 1; } return autorId; }

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

public Livro getLivro() { return livro; }

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

public void gravarAutor(){ Autor autor = new DAO(Autor.class).buscaPorId(this.autorId); this.livro.adicionaAutor(autor); }

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.class).adiciona(this.livro); }

}

HTTP Status 500 - javax.el.PropertyNotFoundException: /livro.xhtml @33,51 value="#{livroBean.autorId}": Property 'autorId' not writable on type br.com.caelum.livraria.bean.LivroBean

type Exception report

message javax.el.PropertyNotFoundException: /livro.xhtml @33,51 value="#{livroBean.autorId}": Property 'autorId' not writable on type br.com.caelum.livraria.bean.LivroBean

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

exception

javax.servlet.ServletException: javax.el.PropertyNotFoundException: /livro.xhtml @33,51 value="#{livroBean.autorId}": Property 'autorId' not writable on type br.com.caelum.livraria.bean.LivroBean javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) root cause

javax.faces.component.UpdateModelException: javax.el.PropertyNotFoundException: /livro.xhtml @33,51 value="#{livroBean.autorId}": Property 'autorId' not writable on type br.com.caelum.livraria.bean.LivroBean javax.faces.component.UIInput.updateModel(UIInput.java:853) javax.faces.component.UIInput.processUpdates(UIInput.java:735) javax.faces.component.UIForm.processUpdates(UIForm.java:281) javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1228) com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) root cause

javax.el.PropertyNotFoundException: /livro.xhtml @33,51 value="#{livroBean.autorId}": Property 'autorId' not writable on type br.com.caelum.livraria.bean.LivroBean com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:133) javax.faces.component.UIInput.updateModel(UIInput.java:818) javax.faces.component.UIInput.processUpdates(UIInput.java:735) javax.faces.component.UIForm.processUpdates(UIForm.java:281) javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1228) com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 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/7.0.52 logs.

o method estah lá mas não reconhece .... nao entendi...

pode me ajudar...

16 respostas

logo apôs clicar em #{livroBean.gravarAutor}, eu tomo uma javax.el.PropertyNotFoundException...

eu nao sei onde esta o erro... no livroBean ou no xhtml na el

Oi Rogério,

pela mensagem Property 'autorId' not writable on type br.com.caelum.livraria.bean.LivroBean parece que falta o método setAutorId(..) na classe LivroBean.

abs

Nico !!!

public void setAutorId(.....

existe sim... veja o código acima...

abs e obrigado

Oi Rogério, na sua classe Autor o atributo id é do tipo long (l minúsculo) ou Long (L maiúsculo)?

abs

O nome da sua tabela é "livroBean" ?

Oi Alexsandro, livroBean é o nome do ManagedBean.

maisculo....

Oi Rogério, tente para mim uma vez o método abaixo. Adicione-o na classe LivroBean:

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

É alguma besteira que a gente não está enxergando ....

abs

corrigindo ...

public void setAutorId(String autorId) { 
   System.out.println(autorId); 
}

ola nico ... continua com o mesmo erro...

olhei linha alinha para ver se estava digitando alguma coisa errado.. mas ate agora nada....

error no browser

type Exception report

message javax.el.PropertyNotFoundException: /livro.xhtml @33,51 value="#{livroBean.autorId}": Property 'autorId' not writable on type br.com.caelum.livraria.bean.LivroBean

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

exception

veja código abaixo...

xthml

Novo Livro

Dados do Livro

Autor(es)

----livroBean

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; import br.com.caelum.livraria.modelo.Livro;

@ManagedBean(name="livroBean") @ViewScoped public class LivroBean {

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

public Integer getAutorId() { return autorId; }

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

public void setAutorId(String autorId) { System.out.println(autorId); }

public Livro getLivro() { return livro; }

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

public void gravarAutor(){ Autor autor = new DAO(Autor.class).buscaPorId(this.autorId); this.livro.adicionaAutor(autor); }

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.class).adiciona(this.livro); }

}

----Model package br.com.caelum.livraria.modelo;

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

@Entity public class Autor {

@Id @GeneratedValue 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; }

}

package br.com.caelum.livraria.modelo;

import java.util.ArrayList; import java.util.List;

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

@Entity public class Livro {

@Id @GeneratedValue private Integer id;

private String titulo; private String isbn; private double preco; private String dataLancamento;

@ManyToMany private List autores = new ArrayList();

public List getAutores() { return autores; }

public void adicionaAutor(Autor autor) { this.autores.add(autor); }

public Livro() { }

public Integer getId() { return id; }

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

public String getTitulo() { return titulo; }

public void setTitulo(String titulo) { this.titulo = titulo; }

public String getIsbn() { return isbn; }

public void setIsbn(String isbn) { this.isbn = isbn; }

public double getPreco() { return preco; }

public void setPreco(double preco) { this.preco = preco; }

public String getDataLancamento() { return dataLancamento; }

public void setDataLancamento(String dataLancamento) { this.dataLancamento = dataLancamento; }

}

Rogério, por favor use as formatações. Isso facilita demais a leitura do seu código!

Vi que na classe Autor vc usou Integer para o tipo da id. Altere na classe LivroBean o tipo do atributo autorId para Integer e tente de novo.

Coloque aqui qual foi o resultado, usando as formatações ;)

abs

type Exception report

message javax.el.PropertyNotFoundException: /livro.xhtml @33,51 value="#{livroBean.autorId}": Property 'autorId' not writable on type br.com.caelum.livraria.bean.LivroBean

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

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;
import br.com.caelum.livraria.modelo.Livro;

@ManagedBean(name="livroBean")
@ViewScoped
public class LivroBean {

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

    public Integer getAutorId() {
        return autorId;
    }

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

    public void setAutorId(String autorId) { 
           System.out.println(autorId); 
    }

    public Livro getLivro() {
        return livro;
    }

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

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

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

}

<?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>Autor(es)</legend>
                <h:outputLabel value="Selecionar Autor:" for="autor" />
                <h:selectOneMenu value="#{livroBean.autorId}"> 
                    <f:selectItems value="#{livroBean.autores}" var="autor"
                                   itemLabel="#{autor.nome}" 
                                   itemValue="#{autor.id}"/>                    
                </h:selectOneMenu>
                <h:commandButton value="Gravar Autor" action="#{livroBean.gravarAutor}" />        
        </fieldset>

        <h:commandButton value="Gravar" action="#{livroBean.gravar}"/>

    </h:form>
</h:body>

</html>

package br.com.caelum.livraria.modelo;

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

@Entity
public class Autor {

    @Id
    @GeneratedValue
    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;
    }

}

Oi Rogério,

me manda o projeto (sem os jars) para nico.steppat@caelum.com.br

abs Nico

solução!

limpei o projeto e limpei o container Tomcat....

deu tudo certo...

obrigado Nico...

olá, estou com o mesmo problema do companheiro acima, poderia por gentileza informar o que é na prática "limpei o projeto e limpei o container Tomcat". Para testar no meu projeto.

Oi Marco, abre um novo topico pois esse já foi resolvido.

obrigado, Nico