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

Method not found: [email protected](java.lang.Object, java.lang.Object, java.util.Locale)

<p:column headerText="Preço" sortBy="#{livro.preco}" filterBy="#{livro.preco}" filterFunction="#{livroBean.precoEhMenor}">
                    <h:outputText value="#{livro.preco}">
                        <f:convertNumber type="currency" pattern="R$ #0.00" currencySymbol="R$" locale="pt_BR"/>
                    </h:outputText>
                </p:column>
public boolean precoEhMenor(Object valorColuna, Object filtroDigitado, Locale locale) { //java.util.Locale
        //tirando espaços do filtro
        String textoDigitado = (filtroDigitado == null) ? null : filtroDigitado.toString().trim();

        System.out.println("Filtrando pelo " + textoDigitado + ", Valor do elemento: " + valorColuna);

        // o filtro é nulo ou vazio?
        if (textoDigitado == null || textoDigitado.equals("")) {
            return true;
        }

        // elemento da tabela é nulo?
        if (valorColuna == null) {
            return false;
        }

        try {
            // fazendo o parsing do filtro para converter para Double
            Double precoDigitado = Double.valueOf(textoDigitado);
            Double precoColuna = (Double) valorColuna;

            // comparando os valores, compareTo devolve um valor negativo se o value é menor do que o filtro
            return precoColuna.compareTo(precoDigitado) < 0;

        } catch (NumberFormatException e) {

            // usuario nao digitou um numero
            return false;
        }
    }
GRAVE: javax.el.MethodNotFoundException: /livro.xhtml @67,127 filterFunction="#{livroBean.precoEhMenor}": Method not found: br.com.caelum.livraria.bean.LivroBean@a66c10f.precoEhMenor(java.lang.Object, java.lang.Object, java.util.Locale)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:109)
8 respostas

Oi Rafael

Posta a classe LivroBean inteira ?

abraço

package br.com.caelum.livraria.bean;

import java.io.Serializable;
import java.util.List;
import java.util.Locale;

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;
import br.com.caelum.livraria.util.RedirectView;

@ManagedBean
@ViewScoped
public class LivroBean implements Serializable{

    private static final long serialVersionUID = 1L;

    private Livro livro = new Livro();

    private Livro selectedLivro;

    private Integer autorId;

    private List<Livro> livros;

    public Livro getLivro() {
        return livro;
    }

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

    public Integer getAutorId() {
        return autorId;
    }

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

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

    public List<Livro> getLivros(){
        if(this.livros == null) {
            this.livros = new DAO<Livro>(Livro.class).listaTodos();
        }
        return this.livros;
    }

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

    public RedirectView autorForm() {
        return new RedirectView("autor");
    }

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

        if (livro.getAutores().isEmpty()) {
            FacesContext.getCurrentInstance().addMessage("autor", new FacesMessage("O livro precisa de um autor, "
                    + "a não ser que foi escrito pelo gasparzinho"));
            return;
        }

        if(this.livro.getId()==null) {
            new DAO<Livro>(Livro.class).adiciona(this.livro);
            this.livros = new DAO<Livro>(Livro.class).listaTodos();
        }else {
            new DAO<Livro>(Livro.class).atualiza(this.livro);
        }

        this.livro = new Livro();
    }

    public void remove(Livro livro) {
        new DAO<Livro>(Livro.class).remove(livro);
        this.livros = new DAO<Livro>(Livro.class).listaTodos();
    }

    public void removeAutor(Autor autor) {
        this.livro.removeAutor(autor);
    }

    public void carrega(Livro livro) {
        this.livro = livro;
    }

    public void carregaPeloId() {
        Integer id = this.livro.getId();
        this.livro = new DAO<Livro>(Livro.class).buscaPorId(id);
        if(this.livro == null) {
            this.livro = new Livro();
        }
    }

    public void comecaComDigitoUm(FacesContext facesContext,UIComponent uiComponent, Object valor) {
        if(!valor.toString().startsWith("1")) {
            throw new ValidatorException(new FacesMessage("O ISBN só pode começar com 1, vc (Faustão: -EROUUUU"));
        }
    }

    public void setSelectedLivro(Livro selectedLivro) {
        this.selectedLivro = selectedLivro;
    }

    public Livro getSelectedLivro() {
        return selectedLivro;
    }

}

Oi Rafael

No seu primeiro post você colou a implementação do método precoEhMenor e agora no LivroBean que você colou ele não aparece.

Veja que a mensagem da Exception fala que ele não encontrou o método dentro do LivroBean. Veja isso novamente, da um restart no servidor e teste novamente.

Abraço

Eu tirei, pq tava fazendo outras coisas, pro problema não persistir.

Coloquei de volta, e o erro persiste.

Rafael

Parece que só tem um problema ai, você deu uns nomes ao parâmetro diferente do padrão, tentei adiantar para você, só colar ai o método :

public boolean precoEhMenor(Object value, Object filter, Locale locale) { //java.util.Locale
        //tirando espaços do filtro
        String textoDigitado = (filter == null) ? null : filter.toString().trim();

        System.out.println("Filtrando pelo " + textoDigitado + ", Valor do elemento: " + value);

        // o filtro é nulo ou vazio?
        if (textoDigitado == null || textoDigitado.equals("")) {
            return true;
        }

        // elemento da tabela é nulo?
        if (value == null) {
            return false;
        }

        try {
            // fazendo o parsing do filtro para converter para Double
            Double precoDigitado = Double.valueOf(textoDigitado);
            Double precoColuna = (Double) value;

            // comparando os valores, compareTo devolve um valor negativo se o value é menor do que o filtro
            return precoColuna.compareTo(precoDigitado) < 0;

        } catch (NumberFormatException e) {

            // usuario nao digitou um numero
            return false;
        }
    }

Eu estou me baseando na documentação e em umas pesquisas aqui ok ? Me avisa se deu certo ou não ?

abraço

Continua o mesmo problema, e o estranho é que se você ver eu abri mais uns três tópicos de not found também, porém são outros métodos e outros atributos, sabe o que pode estar acontecendo?

solução!

Formatei a maquina, e agora ta funcionando, deve ter sido algum hacker xD