1
resposta

javax.servlet.ServletException: The class 'com.dev.casadocodigo.loja.beans.AdminLivrosBean$Proxy$_$$_WeldSubclass' does not have the property 'salvar'.

Olá,

Estou tendo esse problema no meu código, alguem consegue me ajudar, segue imagem do erro abaixo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Classe AdminLivrosBean

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

import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.transaction.Transactional;

import com.dev.casadocodigo.loja.daos.AutorDao;
import com.dev.casadocodigo.loja.daos.LivroDao;
import com.dev.casadocodigo.loja.models.Autor;
import com.dev.casadocodigo.loja.models.Livro;

@Named
@RequestScoped
public class AdminLivrosBean {
    
    private Livro livro = new Livro();
    
    @Inject
    private LivroDao dao;
    @Inject
    private AutorDao autorDao;
    @Inject
    private FacesContext context; 
    
    private List<Integer> autoresId = new ArrayList<>();

    @Transactional
    public String salvar() {
        for (Integer autorId : autoresId) {
            livro.getAutores().add(new Autor(autorId));
        }
        dao.salvar(livro);
        
        context.getExternalContext()
            .getFlash().setKeepMessages(true);
        context
            .addMessage(null, new FacesMessage("Livro cadastrado com sucesso!"));
        
        return "/livros/lista?faces-redirect=true";
    }

    public List<Autor> getAutores() {
        return autorDao.listar();
    }
    
    public Livro getLivro() {
        return livro;
    }

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

    public List<Integer> getAutoresId() {
        return autoresId;
    }

    public void setAutoresId(List<Integer> autoresId) {
        this.autoresId = autoresId;
    }
    
}

Arquivo form.xhtml

<!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://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core">

    <h:form>
        <div>
            <h:outputLabel value="Título" />
            <h:inputText value="#{adminLivrosBean.livro.titulo}"
                required="true" id="titulo" />
            <h:message for="titulo" />
        </div>
        <div>
            <h:outputLabel value="Descrição"/>
            <h:inputTextarea rows="4" cols="20"
                required="true" value="#{adminLivrosBean.livro.descricao}"
                id="descricao" />
            <h:message for="descricao" />
        </div>
        <div>
            <h:outputLabel value="Número de Páginas"/>
            <h:inputText value="#{adminLivrosBean.livro.numeroPaginas}" 
                required="true" id="numeroPaginas" />
            <h:message for="numeroPaginas" />
        </div>
        <div>
            <h:outputLabel value="Preço"/>
            <h:inputText value="#{adminLivrosBean.livro.preco}" 
                required="true" id="preco" />
            <h:message for="preco" />
        </div>
        <div>
            <h:outputLabel value="Autores" />
            <h:selectManyListbox	 value="#{adminLivrosBean.autoresId}"
                    converter="javax.faces.Integer" id="autores">
                <f:selectItems value="#{adminLivrosBean.autores}"
                    var="autor"
                    itemValue="#{autor.id}" itemLabel="#{autor.nome}" />
            </h:selectManyListbox>
            <h:message for="autores" />
        </div>
        <h:commandButton value="Cadastrar" action="#{adminLivrosBean.salvar}" />
    </h:form>

</html>

Alguém consegue me ajudar, pois o método salvar está na classe bean.

Estou seguindo conforme o instrutor fez na aula do link abaixo: https://github.com/alura-cursos/java-ee-webapp/tree/master/javaee-m1a3

1 resposta

Olá Hemerson, tudo bem?

O curso em questão que você está realizando esse projeto foi descontinuado, então não faz parte da nossa grade oficial. E como é um curso de mais de 5 anos, algumas bibliotecas e métodos se descontinuaram com o tempo, o que provavelmente está causando o seu problema com o método salvar no Bean.

Como recomendação, deixo alguns cursos mais atuais sobre JPA:

O link a seguir é para uma formação, e a partir do segundo curso você irá evoluir o projeto com a conectividade com um banco de dados usando o JPA com HIbernate como ORM.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.