Property not found on type...[RESOLVIDO]

12 respostas
araujoGo

Boa Tarde pessoal,
Abaixo um problema interminante que estou tendo com primeira aplicação, Eclipse+ HIbernate4.1 +JSP2.1

javax.servlet.ServletException: /mostraprodutos.jsp(13,1) '#{produtoController.exibir}' Property 'exibir' not found on type br.com.controller.ProdutoController
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)

root cause

org.apache.jasper.el.JspPropertyNotFoundException: /mostraprodutos.jsp(13,1) '#{produtoController.exibir}' Property 'exibir' not found on type br.com.controller.ProdutoController
org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:109)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
javax.faces.component.UIData.getValue(UIData.java:731)
javax.faces.component.UIData.getDataModel(UIData.java:1798)
javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
javax.faces.component.UIData.setRowIndex(UIData.java:473)
com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)
javax.faces.component.UIData.encodeBegin(UIData.java:1118)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1777)
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)
com.sun.faces.application.view.JspViewHandlingStrategy.doRenderView(JspViewHandlingStrategy.java:432)
com.sun.faces.application.view.JspViewHandlingStrategy.renderView(JspViewHandlingStrategy.java:233)
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
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)
mostraproduto.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f"  uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h"  uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Produtos</title>
</head>
<body>
<f:view>
<h:form>
	<h:dataTable border="1" value="#{produtoController.exibir}" var="item" cellpadding="2"
	cellspacing="0">
	<f:facet name="header">
		<h:outputText value="Produtos Cadastrados" />
	</f:facet>
	<h:column>
		<f:facet name="header">
			<h:outputText value="Código do Produto" />
		</f:facet>
		<h:outputText value="#{item.id }" />
	</h:column>
	<h:column>
		<f:facet name="header">
			<h:outputText value="Nome do Produto" />
		</f:facet>
		<h:outputText value="#{item.nomeProduto }" />
	</h:column>
	<h:column>
		<f:facet name="header">
			<h:outputText value="R$" />
		</f:facet>
		<h:outputText value="#{item.valorProduto }" />
	</h:column>
	</h:dataTable>
	<h:commandLink action="novo" value="Adicionar novo produto" />
</h:form>
</f:view>
</body>
</html>
ProdutoController.java
package br.com.controller;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.xml.ws.spi.ServiceDelegate;

import br.com.bean.Produto;
import br.com.dao.ProdutoDAO;

public class ProdutoController {
	private Produto produto;
	private DataModel model;
	
	public ProdutoController(){
		produto = new Produto();
	}
	
	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public String salvar(){
		ProdutoDAO produtodao = new ProdutoDAO();
		produtodao.salvar(produto);
		return "salvar";
	}
	
	public DataModel getExibir(){
		ProdutoDAO produtoDao = new ProdutoDAO();
		model = new ListDataModel(produtoDao.listarProduto());
		return model;
	}
	
	public DataModel getExibirBusca(){
		ProdutoDAO produtodao = new ProdutoDAO();
		produtodao.buscarProduto(produto.getNomeProduto());
		
		model = new ListDataModel(produtodao.buscarProduto(produto.getNomeProduto()));
		return model;
	}
}
faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xi="http://www.w3.org/2001/XInclude"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
 <application>
   <locale-config/>
 </application>
 <factory/>
 <lifecycle/>
 <managed-bean>
 	<managed-bean-name>produtoController</managed-bean-name>
 	<managed-bean-class>br.com.controller.ProdutoController</managed-bean-class>
 	<managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
 <navigation-rule>
 	<from-view-id>/cadastro.jsp</from-view-id>
 	<navigation-case>
 		<from-outcome>salvar</from-outcome>
 		<to-view-id>/mostraprodutos.jsp</to-view-id>
 	</navigation-case>
 	<navigation-case>
 		<from-outcome>exibir</from-outcome>
 		<to-view-id>/mostraprodutos.jsp</to-view-id>
 	</navigation-case>
 	<navigation-case>
 		<from-outcome>buscar</from-outcome>
 		<to-view-id>/busca.jsp</to-view-id>
 	</navigation-case>
 </navigation-rule>
 <navigation-rule>
 	<from-view-id>/mostraprodutos.jsp</from-view-id>
 	<navigation-case>
 		<from-outcome>novo</from-outcome>
 		<to-view-id>/cadastro.jsp</to-view-id>
 	</navigation-case>
 </navigation-rule>
 <navigation-rule>
 	<from-view-id>/busca.jsp</from-view-id>
 	<navigation-case>
 		<from-outcome>buscar</from-outcome>
 		<to-view-id>/resultadobusca.jsp</to-view-id>
 	</navigation-case>
 </navigation-rule>

</faces-config>

Alguem?????

12 Respostas

araujoGo

Poxa, ninguem??
Já conferi o face-config.xml, já olhei a conexao com o banco, revisei as classes e as regras, os jsp’s correspondentes a esse erro, procurei em tudo que é topico e nada…
se alguem puder ajudar…
valeu

Rodrigo_Sasaki

Não sei se é isso… mas o value da sua <h:dataTable> não deveria ser uma Collection?

A

To com o digão nessa. Tu tem a tua classe controle aí:

package br.com.controller;  
      
    import javax.faces.model.DataModel;  
    import javax.faces.model.ListDataModel;  
    import javax.xml.ws.spi.ServiceDelegate;  
      
    import br.com.bean.Produto;  
    import br.com.dao.ProdutoDAO;  
      
    public class ProdutoController {  
        private Produto produto;  
        private DataModel model;  
          
        public ProdutoController(){  
            produto = new Produto();  
        }  
          
        public Produto getProduto() {  
            return produto;  
        }  
      
        public void setProduto(Produto produto) {  
            this.produto = produto;  
        }  

        //você precisa de algum tipo de lista, pra fucnionar seria como no método abaixo marromenos
        public List&lt;?&gt; getExibir() {  
            return new ArrayList&lt;?&gt;(); //é só retornar uma lista que funciona
        }  
        //***********

      
        public String salvar(){  
            ProdutoDAO produtodao = new ProdutoDAO();  
            produtodao.salvar(produto);  
            return "salvar";  
        }  
          
        public DataModel getExibir(){  
            ProdutoDAO produtoDao = new ProdutoDAO();  
            model = new ListDataModel(produtoDao.listarProduto());  
            return model;  
        }  
          
        public DataModel getExibirBusca(){  
            ProdutoDAO produtodao = new ProdutoDAO();  
            produtodao.buscarProduto(produto.getNomeProduto());  
              
            model = new ListDataModel(produtodao.buscarProduto(produto.getNomeProduto()));  
            return model;  
        }  
    }

senão você não vai estar exibindo valor algum na sua lista. O JSF recebe List, Collection e mais uma que eu não lembro se não me engano.

araujoGo

opa valeu a resposta mas continua o erro, meu método ficou assim

public List<?> getExibir(){ ProdutoDAO produtoDao = new ProdutoDAO(); ArrayList<?> list = new ArrayList<>(produtoDao.listarProduto()); return list; }

mesmo assim o erro persiste na mesma linha… o que acham?

detalhe que no log lança tambem outra exception, talvez diga alguma coisa:

org.hibernate.hql.internal.ast.QuerySyntaxException: produto is not mapped [from produto]
drsmachado

Tem uma coisa que eu não entendo. Se você NÃO está utilizando generics, por que raios o nome do getter é diferente do nome da propriedade? É uma espécie de criptografia?
[chaves mode: on]
De tamarindo, com cor de groselha e sabor de limão?
[chaves mode: off]

private DataModel model;  
    public DataModel getExibir(){  
        ProdutoDAO produtoDao = new ProdutoDAO();  
        model = new ListDataModel(produtoDao.listarProduto());  
        return model;  
    }

Sinceramente, devo ser muito caxias nesse ponto, por que eu só uso coisas parecidas quando estou implementando uma interface com generics.

Hebert_Coelho

Você mapeou a classe? produto is not mapped [from produto] Você ta passando na consulta o nome exatamente igual ao nome da classe? from produto é != de from Produto

Rodrigo_Sasaki

essa exceção não foi a mesma que você postou acima.

E tente tipar a sua lista, por exemplo, se ela for uma lista de instancias de Produto, faça assim:

public List<Produto> getExibir(){ ProdutoDAO produtoDao = new ProdutoDAO(); ArrayList<Produto> list = new ArrayList<Produto>(produtoDao.listarProduto()); return list; }

araujoGo

@drsmachado na verdade eu to aprendendo JSF e este e o primeiro exemplo prático do guia, que por sua vez veio totalmente "desrregulado", ja to a semana toda parado nele e com varias modificações consegui gravar no banco de dados com sucesso, dei ate um beijo na minha sogra de felicidade...

jakefrog Você mapeou a classe? produto is not mapped [from produto] Você ta passando na consulta o nome exatamente igual ao nome da classe? from produto é != de from Produto
Sim revisei esta parte tambem, classe produtoDAO a seguir:
package br.com.dao;

import java.util.List;

import org.hibernate.Query;

import br.com.bean.Produto;

public class ProdutoDAO extends DAO {

		public void salvar(Produto produto){
			begin();
			getSession().save(produto);
			commit();
			getSession().flush();
		}
		
		public List listarProduto(){
			String hql = "from produto";
			Query query = getSession().createQuery(hql);
			List list = query.list();
			return list;
		}
		
		public List buscarProduto(String produto){
			String hql = "from produto p where p.nomeProduto like:produto";
			Query query = getSession().createQuery(hql);
			List list = query.setString("produto", "%"+produto+"%").list();
			return list;
		}
}

@digaoneves, Na verdade o log contem essas duas exceptions, só adicionei essa ultima pq talvez desse alguma luz do problema, e tentei a list com tipo Produto, mesma coisa..(nada)

Hebert_Coelho

Coloca como você mapeou aí.

araujoGo
Produto.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 04/05/2012 16:06:36 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="br.com.bean.Produto" table="estoque">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="nomeProduto" type="java.lang.String">
            <column name="NOMEPRODUTO" />
        </property>
        <property name="qtde" type="int">
            <column name="QTDE" />
        </property>
        <property name="valorProduto" type="double">
            <column name="VALORPRODUTO" />
        </property>
    </class>
</hibernate-mapping>
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
        <property name="hibernate.connection.password">admin</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/livroAutomovel</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.default_schema">livroAutomovel</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <mapping resource="br/com/bean/Produto.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Nao acho que seja problema de mapeamento pois consegui gravar no banco..(detalhe que no BD a tabela se chama estoque)

Hebert_Coelho

Repare que sua classe está com o P e não p…
br.com.bean.Produto

araujoGo

Resolvido jakefrog,
era isso, alem de adicioanr a Colecttions no método, mudei a case na consulta HQL , rodou 100% e como tinha colocado exatamente como no guia nem desconfiei… Obrigado e abração a todos, graças a vcs vou tomar uma mais tranquilo hoje!

Lição do dia(não confie cegamente em guias práticos)…

Criado 16 de maio de 2012
Ultima resposta 18 de mai. de 2012
Respostas 12
Participantes 5