Problema LazyDataModel + RequestScoped + CDI

16 respostas
G

estou tentando implementar um LazyDataModel, só que estou com alguns problemas, o LazyDataModel não funciona corretamente quando utilizo RequestScoped, na tabela tenho um commandButton para excluir um item, ao clicar no botão a action não é chamada quando o scope é request, se eu utilizar o mesmo código e mudar para SessionScoped funciona perfeitamente, alguém já passou por isso?

Já procurei na net algo relacionado mas até agora não encontrei nada, tentei tbm remover o lazydatamodel e retornar um List para o dataTable usando escopo resquest, pra ver no que dava funcionou sem problema, só não funciona quanto utilizo o lazy.

alguma ajuda?

cidade_list.xhtml
<p:dataTable id="tabelaCidade"
							 value="#{cidadeBean.cidadeLazy}"
							 var="cidade"
							 paginator="true"
							 rows="5"
							 paginatorPosition="bottom"
							 currentPageReportTemplate="({currentPage} de {totalPage})"
							 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
					<f:facet name="header">
						<h:outputText value="Lista de Cidades" />
					</f:facet>
					<p:column> 
						<f:facet name="header">
							<h:outputText value="Nome" />
						</f:facet>
						<h:outputText value="#{cidade.nome}" />
					</p:column>
					<p:column> 
						<f:facet name="header">
							<h:outputText value="Estado" />
						</f:facet>
						<h:outputText value="#{cidade.estado.nome}" />
					</p:column>
					<p:column style="width: 200px;"> 
						<f:facet name="header">
							<h:outputText value="Ações" />
						</f:facet>
						<p:button id="botaoEditar"
			            		  value="Editar"
			            		  title="Editar"
			            		  icon="ui-icon-pencil"
			            		  outcome="cidade_edit">
			            	<f:param name="id" value="#{cidade.id}"/>
			            </p:button>
						<p:commandButton title="Excluir"
										 value="Excluir"
			            				 icon="ui-icon-trash"
			            				 action="#{cidadeBean.remover}">
			            	<f:setPropertyActionListener target="#{cidadeBean.cidade}" value="#{cidade}"/>
			            </p:commandButton>
					</p:column>
				</p:dataTable>

CidadeBean.java

@Named
@RequestScoped
public class CidadeBean implements Serializable {

	@EJB
	private CidadeFacade cidadeFacade;
	private Cidade cidade;
	private CidadeLazy cidadeLazy;

	public CidadeBean() {
	}

	public void remover() {
		if (cidade != null) {
			cidadeFacade.remover(cidade);
		}
	}

	public CidadeLazy getCidadeLazy() {
		if (cidadeLazy == null) {
			cidadeLazy = new CidadeLazy(cidadeFacade);
		}
		return cidadeLazy;
	}

	public Cidade getCidade() {
		return cidade;
	}

	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}

Quando clica no botão Excluir não chama o método remover() de nenhum jeito, já tentei tbm usar actionListener no lugar de action a tbm não funcionou.

Como resolver isso? Será algum bug do prime?

16 Respostas

Hebert_Coelho

coloca no seu botão ajax=“false”.

Não é bug dele, se vc ler a documentação vc vai ver que o padrão dele é ajax sempre true.

G

Eu já tinha tentado com ajax=“false” e tbm não funcionou.

Hebert_Coelho

Mantendo seu ajax = false faça seu método assim

public String remover() { //seu código return null; }

G

jakefrog, obrigado por responder, mas isso tbm não funcionou, o método continua não sendo chamado.

Hebert_Coelho

Seu código está dentro de h:form?

Hebert_Coelho

Outra coisa, ao clicar você não está tendo erro algum aparecendo no console?

G

Sim o código do p:dataTable está dentro de um h:form

Nenhum erro é lançado no console, já tentei de quase tudo pra fazer isso funcionar e nada, já to ficando maluco aqui hehe, como falei se eu mudar o escopo para session funciona perfeitamente, com escope de request só não funciona quando utilizo o LazyDataModel, se ao invés de usar o lazy eu utilizar um List para preencher o datatable funciona certinho com escopo request.

Alguma outra sugestão? Ou será que é algum bug do primefaces?

Hebert_Coelho

Não creio que seja bug do prime.

sua página está dentro de outra, que está dentro de outra e assim vai?

Se sim, coloca apenas esse código em uma pagina separada e tenta chamar.

Veja se vai chamar.

Outra coisa, vc criou o beans xml?

G
sua página está dentro de outra, que está dentro de outra e assim vai?

Sim criei um template e adiciono a página no template.

Separei o código em um página separada e ficou assim:

<!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://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"
      xmlns:t="http://myfaces.apache.org/tomahawk">

	<f:view>
		<h:head>
			<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
		</h:head>
		<h:body>
			<h:form>				
				<p:dataTable id="tabelaCidade"
							 value="#{cidadeBean.cidadeLazy}"
							 var="cidade"
							 paginator="true"
							 rows="5"
							 paginatorPosition="bottom"
							 currentPageReportTemplate="({currentPage} de {totalPage})"
							 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
					<f:facet name="header">
						<h:outputText value="Lista de Cidades" />
					</f:facet>
					<p:column> 
						<f:facet name="header">
							<h:outputText value="Nome" />
						</f:facet>
						<h:outputText value="#{cidade.nome}" />
					</p:column>
					<p:column> 
						<f:facet name="header">
							<h:outputText value="Estado" />
						</f:facet>
						<h:outputText value="#{cidade.estado.nome}" />
					</p:column>
					<p:column style="width: 200px;"> 
						<f:facet name="header">
							<h:outputText value="Ações" />
						</f:facet>
						<p:button id="botaoEditar"
			            		  value="Editar"
			            		  title="Editar"
			            		  icon="ui-icon-pencil"
			            		  outcome="cidade_edit">
			            	<f:param name="id" value="#{cidade.id}"/>
			            </p:button>
						<p:commandButton title="Excluir"
										 value="Excluir"
			            				 icon="ui-icon-trash"
			            				 action="#{cidadeBean.remover}"
			            				 ajax="false">
			            	<f:setPropertyActionListener target="#{cidadeBean.cidade}" value="#{cidade}"/>
			            </p:commandButton>
					</p:column>
				</p:dataTable>
				<p:commandButton id="botaoNovo"
								 value="Novo"
								 action="Novo"/>
			</h:form>
		</h:body>
	</f:view>
</html>
Outra coisa, vc criou o beans xml?

Sim, está dessa forma:

beans xml

<?xml version="1.0"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://jboss.org/schema/cdi/beans_1_0.xsd">
</beans>

Mesmo separando a página continua não chamando o método remover. Quanto eu clico no botão excluir eu percebo que o método load do LazyDataModel é chamado, mas o método remover do meu bean não é.

Hebert_Coelho

E o método remover está como String remover() né? Retornando null?

Outra coisa, testa colocar seu f:view assim: <f:view contentType=“text/html”>

Hebert_Coelho

E tenta colocar o f:view apenas dentro do h:body

G

Sim o método remover está como String remover() retornando null.

Mudei o f:view para dentro do h:body mas também não chamou o método remover.

jakefrog alguma vez vc já utilizou o LazyDataModel do primefaces dessa maneira que estou tentando utilizar?

Hebert_Coelho

Não.

Mas chamar ou não um método não tem relação com o LazyModel (imagino seu), mas sim com o JSF.

Tem como você colocar os imports das anotações abaixo?
@Named
@RequestScoped

G

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;

Hebert_Coelho

Cara, realmente tá bizarro, olhei aqui com o código fonte do pessoal do livro Core JavaServerFaces e a diferença é que eles declaram assim:
@Named(“user”)

Você pode tentar colocar um apelido aí.

Eu achei um exemplo na net que utiliza outro esquema de beans.xml, diferente do seu:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://java.sun.com/xml/ns/javaee" 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/beans_1_0.xsd"> </beans>

E por último, tenta com SessionScoped.

Boa sorte aí.

G

Pois é eu tbm acho isso muito bizarro, ainda continuo achando que pode ser algum bug do primefaces com escope request e lazydatamodel, o problema só ocorre quando utiliza esse conjunto, se usar um List funciona normalmente só não vai com o lazy, não tava querendo usar sessão se pelo menos o CDI tivesse um escopo de view já resolvia o problema, mas valeu pela ajuda vou continuar tentando, se encontrar uma solução eu posto.

Criado 3 de fevereiro de 2012
Ultima resposta 6 de fev. de 2012
Respostas 16
Participantes 2