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

EJB

Ola, eu crie a classe AutorService e alterei a classe AutorBean como pedido no exercício... as classes compilaram, mas quando tendo acessar a aba autor ... recebo o erro abaixo...

type Exception report

message

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

exception

javax.servlet.ServletException: /autores.xhtml @32,86 value="#{autorBean.autores}": The class 'br.com.caelum.livraria.bean.AutorBean$Proxy$_$$_WeldClientProxy' does not have the property 'autores'. javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62) root cause

javax.el.PropertyNotFoundException: /autores.xhtml @32,86 value="#{autorBean.autores}": The class 'br.com.caelum.livraria.bean.AutorBean$Proxy$_$$_WeldClientProxy' does not have the property 'autores'. com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111) javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) javax.faces.component.UIData.getValue(UIData.java:731) org.primefaces.component.api.UIData.getDataModel(UIData.java:615) javax.faces.component.UIData.getRowCount(UIData.java:356) org.primefaces.component.datalist.DataListRenderer.encodeMarkup(DataListRenderer.java:58) org.primefaces.component.datalist.DataListRenderer.encodeEnd(DataListRenderer.java:45) javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786) javax.faces.render.Renderer.encodeChildren(Renderer.java:168) javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402) com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125) javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)

6 respostas

Tem os métodos gets e sets do seu autores dentro da class AutorBean ?

Não. neste exemplo a classe não possui estes métodos.

até onde eu sei, esse erro se dá porque o JSF procura a propriedade getAutores(), como vc não implementou o get do tipo autores ele não encontra. por isso javax.el.PropertyNotFoundException

Como pode ver nas classes abaixo, no meu AutorBean eu injeto minha interface dao, na qual é implementada pela class AutorDao. assim na minha AutorBean eu coloquei meu getAutores() que chama o método todosAutores() retornando uma list

Basicamente acredito que se vc criar esse getAutores() retornando uma lista de autores seu problema pode ser resolvido, OBS: eu utilizei interface mas você pode usar o @inject direto na class que está sendo gerenciada pelo container EJB, ou seja o AutorDao

qualquer coisa, se não resolver, compartilha ai seu código para que eu possa analisar um pouco melhor.

class(AutorBean)

@Model
public class AutorBean {
    private Autor autor = new Autor();

    @Inject
    private AutorInterface dao;


    public Autor getAutor() {
        return autor;
    }

    public void cadastra(){
        this.dao.salva(autor);

        this.autor = new Autor();
    }

    public List<Autor> getAutores() {
        return this.dao.todosAutores();
    }
}

interface(AutorInterface)

public interface AutorInterface {
    void salva(Autor autor);
    List<Autor> todosAutores();
    Autor buscaPelaId(Integer id);
}

método que busca todosAutores localizado na class(AutorDao que implementa minha interface AutorInterface)

public List<Autor> todosAutores() {
    return manager.createQuery("select a from Autor a",Autor.class).getResultList();
}

William, obrigado pela ajuda, mas ainda não resolveu. A classe AutorBean que eu tenho esta modificada para trabalhar com o apoio da classe autorService.

Classe AutorBean

@Model public class AutorBean {

private Autor autor = new Autor();

@Inject private AutorServcice service;

public Autor getAutor() { return autor; }

public void cadastra() { this.service.adiciona(autor); this.autor = new Autor(); }

public List todosAutores() { return this.service.todosAutores(); } }

CLasse autorService

@Stateless public class AutorServcice {

@Inject AutorDao dao;

public void adiciona(Autor autor) { dao.salva(autor); }

public List todosAutores(){ return dao.todosAutores(); }

}

Arquivo XML autores

<?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">

Cadastro de autores

Autores

#{autor.nome}

ok Emerson, vamos fazer assim: eu modifiquei o meu código para utilizar sua classe AutorServcice.note que a unica diferença do meu código para o seu, é o nome do seu metodo todosAutores() muda ele para getAutores() porque o JSF procura o resultado nos métodos gets, ou seja(getAutores), da forma que vc fez, o JSF não consegue mapear e encontrar sua lista de autores para listar na sua .xhtml. seu problema aqui não é com EJB mais sim com JSF.

quando você tenta listar na sua .xhtml usando JSF, vc coloca no value (autorBean.autores) correto ? esse o JSF vai procurar na minha AutorBean um método chamado getAutores, e no seu caso ele não encontra porque ele se chama todosAutores. conseguiu entender ? eu sou horrível para explicar kkkk. abaixo segue o código adaptado para utilizar a classe autorService

<p:dataList id="autores" value="#{autorBean.autores}" var="autor" itemType="disc">
                #{autor.nome}
</p:dataList>

class AutorBean

@Model
public class AutorBean {

    private Autor autor = new Autor();

    @Inject 
    private AutorService service;

    public Autor getAutor() { 
        return autor; 
    }

    public void cadastra() { 
        this.service.adiciona(autor); 
        this.autor = new Autor(); 
    }

    public List<Autor> getAutores() { 
        return this.service.todosAutores(); 
    }
}
@Stateless
public class AutorService {
    @Inject
    private AutorInterface autor;

    public void adiciona(Autor autor){
        this.autor.salva(autor);
    }
    public List<Autor> todosAutores() {
        return this.autor.todosAutores();
    }
}
solução!

Perfeito !