Dificuldades com P:DataTable

Olá boa noite, tenho um metodo simples no controler que retorna um ArrayList e na view eu queria chamar esse método, segue abaixo o codigo da view

<?xml version="1.0" encoding="UTF-8" ?>
<ui:composition template="template.xhtml"
	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui">
	<ui:define name="corpo">
		<h:form>
			<p:dataTable id="dataTable" value="#{produtoControle.listaTodos()}" var="item" paginator="true" rows="9" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15">
                <f:facet name="header">	Listagem de Produtos </f:facet>

	             <p:column id="livr_id" headerText="ID" styleClass="geral colunaMenor">
		         	  <h:outputText value="#{item.prodId}"/>
	              </p:column>

	             <p:column id="livr_titulo" headerText="Titulo" styleClass="geral colunaMaior">
		         	  <h:outputText value="#{item.prodTitulo}" />
	              </p:column>

	             <p:column id="livr_autor" headerText="Autor" styleClass="geral colunaMaior">
		         	  <h:outputText value="#{item.prodAutor}"/>
	              </p:column>

	             <p:column id="livr_preco" headerText="Preço" styleClass="geral colunaMedia">
		         	  <h:outputText value="#{item.prodPreco}" />
	              </p:column>

	    	 </p:dataTable>
     </h:form>
 </ui:define>
 </ui:composition>

Note que o value do dataTable está chamando um método, com H:DATATABLE funcionou certinho, ele trouxe os registros, mas com o P ele da a seguinte exeption:

javax.faces.view.facelets.FaceletException: Error Parsing /livraria/frmListaProdutos.jspx: Error Traced[line: 31] O conteúdo dos elementos deve consistir em dados ou marcação do caractere correto.
	com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:425)
	com.sun.faces.facelets.compiler.SAXCompiler.doMetadataCompile(SAXCompiler.java:408)
	com.sun.faces.facelets.compiler.Compiler.metadataCompile(Compiler.java:130)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.createMetadataFacelet(DefaultFaceletFactory.java:327)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.access$200(DefaultFaceletFactory.java:93)
	com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:166)
	com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:164)
	com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:94)
	com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:89)
	com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:99)
	java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
	java.util.concurrent.FutureTask.run(Unknown Source)
	com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:114)
	com.sun.faces.facelets.impl.DefaultFaceletCache.getViewMetadataFacelet(DefaultFaceletCache.java:143)
	com.sun.faces.facelets.impl.DefaultFaceletCache.getViewMetadataFacelet(DefaultFaceletCache.java:62)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:260)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:209)
	com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(ViewMetadataImpl.java:114)
	com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:233)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

não existe isso:

#{produtoControle.listaTodos()}

deveria ser assim:

#{produtoControle.listaTodos}

quando vc chama um método nao pode passar o ().

Olá bom dia, eu já havia tentado executar o método dessa forma:

<p:dataTable id="dataTable" value="#{produtoControle.listaTodos()}" var="item" paginator="true" rows="9" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15">

Segue abaixo o erro retornado:

javax.servlet.ServletException: Error Parsing /livraria/frmListaProdutos.jspx: Error Traced[line: 31] O conteúdo dos elementos deve consistir em dados ou marcação do caractere correto.
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
	org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

root cause

javax.faces.view.facelets.FaceletException: Error Parsing /livraria/frmListaProdutos.jspx: Error Traced[line: 31] O conteúdo dos elementos deve consistir em dados ou marcação do caractere correto.
	com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:417)
	com.sun.faces.facelets.compiler.SAXCompiler.doMetadataCompile(SAXCompiler.java:400)
	com.sun.faces.facelets.compiler.Compiler.metadataCompile(Compiler.java:130)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.createMetadataFacelet(DefaultFaceletFactory.java:327)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.access$200(DefaultFaceletFactory.java:93)
	com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:166)
	com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:164)
	com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:94)
	com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:89)
	com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:99)
	java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
	java.util.concurrent.FutureTask.run(FutureTask.java:166)
	com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:114)
	com.sun.faces.facelets.impl.DefaultFaceletCache.getViewMetadataFacelet(DefaultFaceletCache.java:143)
	com.sun.faces.facelets.impl.DefaultFaceletCache.getViewMetadataFacelet(DefaultFaceletCache.java:62)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:260)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:209)
	com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(ViewMetadataImpl.java:114)
	com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:233)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

[quote=cristianovieira]Olá bom dia, eu já havia tentado executar o método dessa forma:

<p:dataTable id="dataTable" value="#{produtoControle.listaTodos()}" var="item" paginator="true" rows="9" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15">

Segue abaixo o erro retornado:

javax.servlet.ServletException: Error Parsing /livraria/frmListaProdutos.jspx: Error Traced[line: 31] O conteúdo dos elementos deve consistir em dados ou marcação do caractere correto.
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
	org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

root cause

javax.faces.view.facelets.FaceletException: Error Parsing /livraria/frmListaProdutos.jspx: Error Traced[line: 31] O conteúdo dos elementos deve consistir em dados ou marcação do caractere correto.
	com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:417)
	com.sun.faces.facelets.compiler.SAXCompiler.doMetadataCompile(SAXCompiler.java:400)
	com.sun.faces.facelets.compiler.Compiler.metadataCompile(Compiler.java:130)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.createMetadataFacelet(DefaultFaceletFactory.java:327)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.access$200(DefaultFaceletFactory.java:93)
	com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:166)
	com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:164)
	com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:94)
	com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:89)
	com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:99)
	java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
	java.util.concurrent.FutureTask.run(FutureTask.java:166)
	com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:114)
	com.sun.faces.facelets.impl.DefaultFaceletCache.getViewMetadataFacelet(DefaultFaceletCache.java:143)
	com.sun.faces.facelets.impl.DefaultFaceletCache.getViewMetadataFacelet(DefaultFaceletCache.java:62)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:260)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:209)
	com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(ViewMetadataImpl.java:114)
	com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:233)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

[/quote]

vc leu direito o que eu falei?

Sim, li entendi mas postei errado, segue abaixo o codigo alterado e o erro retornado:

<p:dataTable id="dataTable" value="#{produtoControle.listaTodos}" var="item" paginator="true" rows="9" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15">
com.sun.faces.context.FacesFileNotFoundException: /livraria/livraria/frmListaProdutos.jspx Not Found in ExternalContext as a Resource
	com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:232)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:273)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:209)
	com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(ViewMetadataImpl.java:114)
	com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:233)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

a primeira linha do erro diz que nao encontrou o arquivo frmListaProdutos.jspx é isso mesmo? jspx ?

To achando estranho a exception retornar algo relacionado ao FacesServlet, digo isso pois precisei adicionar o filter do do FileUpLoad para que funcione o Upload em outra tela, então segue abaixo o conteudo do web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>LivrariaDigital</display-name>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/classes/META-INF/spring/root-context.xml</param-value>
	</context-param>
	<!-- -->
	<context-param>
		<param-name>javax.faces.DEFAULT_PREFIX</param-name>
		<param-value>/livraria</param-value>
	</context-param>
	<context-param>
		<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
		<param-value>.jspx</param-value>
	</context-param>
	<context-param>
		<param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
		<param-value>*.jspx</param-value>
	</context-param>
	<context-param>
		<param-name>primefaces.THEME</param-name>
		<param-value>cupertino</param-value>
	</context-param>
	<listener>
		<listener-class>br.com.livraria.arquitetura.util.FiegContextLoaderListener</listener-class>
	</listener>
	<listener>
		<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
	</listener>

	<filter>
		<filter-name>encoding-filter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

	<filter>
		<filter-name>PrimeFaces FileUpload Filter</filter-name>
		<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>PrimeFaces FileUpload Filter</filter-name>
		<servlet-name>Faces Servlet</servlet-name>
	</filter-mapping>

	<filter-mapping>
		<filter-name>encoding-filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<context-param>
		<param-name>com.sun.faces.writeStateAtFormEnd</param-name>
		<param-value>false</param-value>
	</context-param>

	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.faces</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jspx</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.xhtml</url-pattern>
	</servlet-mapping>
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/classes/META-INF/spring/app/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/spring/* </url-pattern>
	</servlet-mapping>
	<session-config>
		<session-timeout>30</session-timeout>
	</session-config>
	<welcome-file-list>
		<welcome-file>livraria/index.jspx</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
</web-app>

Creio que a codificação do datagrid ta correta, não tenho mais opção para alteração.

Exception com as alterações:

javax.servlet.ServletException: Error Parsing /livraria/frmListaProdutos.jspx: Error Traced[line: 31] O conteúdo dos elementos deve consistir em dados ou marcação do caractere correto.
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)

Estive dando uma conversa com um pessoal daqui da empresa e o que me falaram é o seguinte:

Desenvolvimento jsp /jsf o que é comum fazer é colocar atributos dentro do controlador e no get deste atributo o sistema irá popular o objeto e devolver a lista para a camada de visão. Com isso eu teria o seguinte cenário:

  • No controlador eu adicionaria um arraylist:
public 	ArrayList<Produto> arrProdutos = new ArrayList<Produto>();

E no método getArrProdutos() eu iria na persistencia pegar os dados.

O que vocês acham disso ?? È normal isso acontecer ?? Desculpem a ignorancia desenvolvo com flex e o flex acessa via AMF o método de forma direta no codigo action script.

FeedBack da solução - Troquei o nome do método do controle de listarProdutos para getListarProdutos…

Obrigado aos envolvidos.

Nunca popule uma lista direta pelo método get. Pois dependendo do seu scopo ele pode a cada requisição entrar neste método e popular novamente.
Uma forma seria é criar um método inicial e usar a anotação @PostConstruct para popular seus objetos.

Boa noite tente o seguinte:

Na classe Bean

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

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean(name="produtoControle")
@RequestScoped
public class ProdutoBean {
	private List<Produto> lista;
	
	public List<Produto> getLista() {
		//aqui vc irá efetuar a busca no banco de dados e atribuir a variável lista criada acima.
		return this.lista;
	}
}

depois basta subtituir a linha:

por:

[quote=thayson.silva]Boa noite tente o seguinte:

Na classe Bean

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

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean(name="produtoControle")
@RequestScoped
public class ProdutoBean {
	private List<Produto> lista;
	
	public List<Produto> getLista() {
		//aqui vc irá efetuar a busca no banco de dados e atribuir a variável lista criada acima.
		return this.lista;
	}
}

depois basta subtituir a linha:

por:

[/quote]

Isso é errado, a cada requisição que tu fizer a este ManagedBean o método get vai ser chamado, sendo assim vai ir ao banco carregar novamente a lista.

Bom dia grinche,

Eu vi essa descrição no livro: Programação java para web,

como sou novato, gostaria que me informasse sobre essa correção pois estou fazendo assim:

public List<Categoria> getLista() {
		if(this.lista == null){
			CategoriaRN rn = new CategoriaRN();
			this.lista = rn.listar(null);//com o parametro null, a lista carrega todos os registros
		}
		return this.lista;
	}

Desde ja agradeço a informação