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

avax.el.PropertyNotFoundException: Property 'gravarAutor' not found on type br.com.caelum.livraria.bean.LivroBean

Por que está dando essa mensagem quando mudei para :

<p:commandButton value="Gravar Autor" 
                        action="#{livroBean.gravarAutor}" update="tabelaAutores" process="@this " />

minha classe:

package br.com.caelum.livraria.bean;

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

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;

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


@ManagedBean
@ViewScoped
public class LivroBean {

    private Livro livro = new Livro();
    private Integer autorId;
    private List<Livro> livroList = new ArrayList<Livro>();
    private List<Autor> autoresDoLivro = new ArrayList<Autor>();

    public Livro getLivro() {
        return livro;
    }



    public Integer getAutorId() {
        return autorId;
    }



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



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

    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.");
            FacesContext.getCurrentInstance().addMessage("autor", new FacesMessage("Livro deve ter ao menos um autor"));
        }

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


    public List<Livro> listaLivros(){
        return new DAO<Livro>(Livro.class).listaTodos();
    }

    public List<Livro> getLivroList(){
        return this.listaLivros();
    }

    public void setLivroList(List<Livro> livrosList){
        this.livroList= livrosList;
    }



    /*public List<Autor> listaAutoresDoLivro(int id){
        return new DAO<Autor>(Autor.class).listaAutoresDoLivro(id);
    }*/

    public List<Autor> getAutoresDoLivro() {
        return this.autoresDoLivro;
    }



    public void setAutoresDoLivro(List<Autor> autoresDoLivro) {
        this.autoresDoLivro = autoresDoLivro;
    }



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

    public void comecaComDigitoUm(FacesContext fc, UIComponent component, Object value) throws ValidatorException{
            String valor = value.toString();
            if(!valor.startsWith("1")){
                throw new ValidatorException(new FacesMessage("O ISBN deve comecar com 1"));
            }
    }

}
8 respostas

Oi Tathiana

Você está conseguindo utilizar outros componentes do prime faces sem problemas? E a sua aplicação estava funcionando com o h:commandButton do jsf?

sim, estava. foi quando coloquei o botão q deu problema

Olá Tathiana, tudo bem?

Pode mandar o código do seu .xhtml?

Abraço!

Opa, posso sim:

<?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"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">

    <ui:composition template="_template.xhtml">
        <ui:define name="titulo">
            Novo Livro
        </ui:define>
        <ui:define name="conteudo">
            <h:form>
                <p:messages id="messages" autoUpdate="true"/>
                <p:growl autoUpdate="true"></p:growl>
                <p:fieldset legend="Dados do Livro">
                    <h:panelGrid columns="2">
                        <h:outputLabel value="Titulo:" for="titulo" />
                        <p:inputText id="titulo" value="#{livroBean.livro.titulo}" required="true" requiredMessage="Titulo obrigatório" validatorMessage="Titulo superior a 40">
                            <f:validateLength maximum="40" />
                            <f:ajax  event="blur"/>
                        </p:inputText> 

                        <h:outputLabel value="ISBN:" for="isbn" />
                        <p:inputText id="isbn" value="#{livroBean.livro.isbn}" validator="#{livroBean.comecaComDigitoUm}">
                            <f:ajax event="blur"/>
                        </p:inputText>


                        <h:outputLabel value="Preço:" for="preco" />
                        <p:inputText id="preco" value="#{livroBean.livro.preco}" validatorMessage="O valor deve estar entre R$1,00 e R$1.000,00">
                            <f:validateDoubleRange minimum="1" maximum="1000"/>
                            <!--  <f:ajax event="blur" render="messages"/> -->
                            <f:ajax event="blur"/>
                        </p:inputText>

                        <h:outputLabel value="Data de Lançamento:" for="dataLancamento" />
                        <p:calendar id="dataLancamento" value="#{livroBean.livro.dataLancamento.time}" pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo"/>
                        <!-->
                            <p:inputText id="dataLancamento" value="#{livroBean.livro.dataLancamento.time}">
                                <f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo"/>
                            </p:inputText>
                        <-->
                    </h:panelGrid>
                </p:fieldset>
                <br/>
                <p:fieldset legend="Dados do Autor">
                    <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}"/>
                    </h:selectOneMenu>
                    <p:commandButton value="Gravar Autor" 
                        action="#{livroBean.gravarAutor}" update="tabelaAutores" />

                    <!-->
                        requisicao feita por ajax
                        <h:commandButton value="Gravar Autor" action="#{livroBean.gravarAutor}">
                            <f:ajax execute="autor" render="tabelaAutores" />
                        </h:commandButton>
                    <-->

                    <br/>
                    <h:commandLink value="Cadastrar novo autor" action="autor?faces-redirect=true" immediate="true"/>
                    <br/>
                    <h:dataTable value="#{livroBean.autoresDoLivro}" var="autor" id="tabelaAutores">
                        <h:column>
                            <h:outputText value="#{autor.nome}"/>
                        </h:column>
                    </h:dataTable>
                </p:fieldset>
                <h:commandButton value="Gravar Livro" action="#{livroBean.gravar}">
                    <f:ajax execute="@form" render="@form :tabelaLivros"/>
                </h:commandButton>
            </h:form>

            <br/>
            <h1>Livros Cadastrados</h1>
            <h:dataTable value="#{livroBean.livroList}" var="livro" border="1" id="tabelaLivros">

                <h:column>
                    <f:facet name="header">ID</f:facet>
                    <h:outputText value="#{livro.id}"/>
                </h:column>

                <h:column>
                    <f:facet name="header">ISBN</f:facet>
                    <h:outputText value="#{livro.isbn}"/>
                </h:column>

                <h:column>
                    <f:facet name="header">Titulo</f:facet>
                    <h:outputText value="#{livro.titulo}"/>
                </h:column>

                <h:column>
                    <f:facet name="header">Autor</f:facet>
                    <h:outputText value="#{livro.autores}"/>
                </h:column>

                <h:column>
                    <f:facet name="header">Data</f:facet>
                    <h:outputText value="#{livro.dataLancamento.time}">
                        <f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo"/>
                    </h:outputText>
               </h:column> 

                <h:column>
                    <f:facet name="header">Preço</f:facet>
                    <h:outputText value="#{livro.preco}">
                        <f:convertNumber type="currency" pattern="R$ #0.00" currencySymbol="R$" locale="pt_BR"/>
                    </h:outputText>    
                </h:column> 


            </h:dataTable>
        </ui:define>
        <ui:define name="texto">
            Cadastro de Livros
        </ui:define>
    </ui:composition>
</html>

Oi Tathiana,

em caso de duvida coloque o atributo actionListener (sem action) no p:commandButton:

 <p:commandButton value="Gravar Autor" actionListener="#{livroBean.gravarAutor}" update="tabelaAutores" />

Também tire o comentário da sua página JSF. Por último, qual versão do primefaces vc usa?

abs

solução!

Oi Thatiana, cuidado com os comentários no XHTML. O JSF interpreta expression language dos comentários! Bizarro não? :) Se por acaso você tiver uma EL que acessa algo que não existe dentro de um comentário você terá um erro.

eram os comentários mesmo! que louco isso! então não tem como comentar o código em jsf?

Olá Tathiana,

Sim, é possível. Basta dizer ao FacesContext que queremos escapar os comentários.

Habilitando no web.xml o seguinte parametro:

<context-param>
    <param-name>facelets.SKIP_COMMENTS</param-name>
    <param-value>true</param-value>
</context-param>

Uma outra opção, seria usar a tag <ui:remove>:

<ui:remove>
     === Trecho que quero comentar ===
</ui:remove>

Ok? Abraços!