1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Integração JPA e JSF: Erro ao acessar ManagedBean

Estou fazendo um exemplo de integração entre JSF e JPA, mas ao executar o .xhtml retorna uma mensagem de que a propriedade da classe bean não existe.

/carros.xhtml @15,66 value="#{carroBean.carro.marca}": The class 'br.com.orei.controle.CarroBean' does not have the property 'carro'

No console apresenta o seguinte erro ao iniciar o Glassfish 4.1.1:

2015-12-29T14:44:04.704-0200|Grave: WebModule[/K19-Integracao-JSF-JPA]Exception starting filter br.com.orei.filters.JPAFilter java.lang.InstantiationException at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:135) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:5329) at org.apache.catalina.core.StandardContext.start(StandardContext.java:5974) at com.sun.enterprise.web.WebModule.start(WebModule.java:691)

A propriedade citada acima está acessível durante a codificação pelo autoComplete do Eclipse. A classe CarroBean está assim:

package br.com.orei.controle;

import br.com.orei.modelo.Carro;
import br.com.orei.modelo.CarroRepository;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;

@ManagedBean
public class CarroBean {

    public Carro carro = new Carro();

    public Carro getCarro() {
        return carro;
    }

    public void setCarro(Carro carro) {
        this.carro = carro;
    }

    public void adicionaCarro() {
        EntityManager manager = this.getEntityManager();
        CarroRepository repository = new CarroRepository(manager);
        repository.adiciona(this.carro);
        this.carro = new Carro();
    }

    public List<Carro> getCarros() {
        EntityManager manager = this.getEntityManager();
        CarroRepository repository = new CarroRepository(manager);
        return repository.buscaTodos();
    }

    private EntityManager getEntityManager() {
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();
        HttpServletRequest request = (HttpServletRequest) ec.getRequest();
        EntityManager manager = (EntityManager) request.getAttribute("EntityManager");

        return manager;

    }

}

A minha classe JPAFilter está assim:

package br.com.orei.filters;

import java.io.IOException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(servletNames = { "Faces Servlet" })
public class JPAFilter implements Filter {

    private EntityManagerFactory emf;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.emf = Persistence.createEntityManagerFactory("K19-PU");
    }

    @Override
    public void destroy() {
        this.emf.close();
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        // CHEGADA
        EntityManager em = this.emf.createEntityManager();
        request.setAttribute("EntityManager", em);
        em.getTransaction().begin();

        // FACES SERVLET
        chain.doFilter(request, response);

        // SAIDA
        try {
            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
        } finally {
            em.close();
        }
    }

}

Segue também persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="K19-PU" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
            <property name="hibernate.hbm2ddl.auto" value="create" />
            <property name="javax.persistence.jdbc.driver"
                value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
            <property name="javax.persistence.jdbc.user" value="sa" />
            <property name="javax.persistence.jdbc.password" value="***" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:sqlserver://localhost:1433;DatabaseName=k19db" />
            <property name="show_sql" value="true" />
            <property name="hibernate.temp.use_jdbc_metadata_defaults"
                value="false" />
        </properties>
    </persistence-unit>
</persistence>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jpa hibernate ou faça a sua própria pergunta.