3
respostas

Erro na exclusão de livros

De acordo com o texto da aula 9, o código do método para remover os livros da lista, que deve ser escrito na classe "LivroBean" segue abaixo:

    public void remover(Livro livro){
        System.out.println("Removendo o livro" + livro.getTitulo());
        new DAO<Livro>(Livro.class).remove(livro);
        this.livros.remove(livro); //removendo da lista
    }

Porém, ao implementar na página "livro.xhtml" o código abaixo, nada acontece.

                <h:column>
                    <f:facet name="header">Remover</f:facet>
                    <h:commandLink value="Remover" action="#{livroBean.remover(livro)}" />
                </h:column>

Aparentemente o problema está na linha

this.livros.remove(livro); //removendo da lista]

porque a palavra "livros" está marcada como erro, e ao passar o mouse por sobre ela, o Eclipse retorna a mensagem "livros cannot be resolved or is not a field".

Como corrigir?

3 respostas

Cola a classe que tem essa linha

this.livros.remove(livro);

por gentileza?

Abraços.

A linha está no método public void remover(Livro livro)

package br.com.caelum.livraria.bean;

import java.io.Serializable;
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;
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 Integer autorId;

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

    public Integer getAutorId() {
        return autorId;
    }

    public Livro getLivro() {
        return livro;
    }

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

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

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

    public void gravarAutor() {
        Autor autor = new DAO<Autor>(Autor.class).buscaPorId(this.autorId);
        this.livro.adicionaAutor(autor);
        System.out.println("Escrito por " + autor.getNome());
    }

    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 pelo menos um Autor."));
        }

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

    public void remover(Livro livro){
        System.out.println("Removendo o livro" + livro.getTitulo());
        new DAO<Livro>(Livro.class).remove(livro);
        this.livros.remove(livro);
    }

    public RedirectView formAutor(){
        System.out.println("Chamando o formulário do autor");
         return new RedirectView("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("ISBN deveria começar com 1"));
        }
    }
}

Segue também a classe Livro

package br.com.caelum.livraria.modelo;

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

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

import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Livro {

    @Id
    @GeneratedValue
    private Integer id;

    private String titulo;
    private String isbn;
    private double preco;
    @Temporal(TemporalType.TIMESTAMP)
    private Calendar dataLancamento = Calendar.getInstance();

    @ManyToMany
    private List<Autor> autores = new ArrayList<Autor>();

    public List<Autor> 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 Calendar getDataLancamento() {
        return dataLancamento;
    }

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


}

```

Então Rodrigo, nesse bean que você colou não existe nenhuma propriedade livros... por isso o eclipse está reclamando. As únicas propriedades que existem nesse beam são

 private static final long serialVersionUID = 1L;

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

Será que essa lista não deveria estar em outra classe? E remover ela pelo DAO já não é o suficiente para o livro sumir da tela? testa só remover essa linha e vê o que acontece.

Espero ter ajudado, Abraços e bons estudos.