F:setPropertyActionListener não funciona na primeira chamada - JSF2.2+Primefaces 5

4 respostas Resolvido
H

Bom dia galera,

Tenho um grid e quando utilizo o p:commandLink com um f:setPropertyActionListener para passar o objeto do grid para excluir ou editar um registro, na primeira chamada o objeto não é carregado no MB, mas ai clicar em seguida, o objeto é carregado.

Só funciona se eu passar o objeto via parâmetro para o método, mas eu queria usar o f:setPropertyActionListener

XHTML

<p:dataTable id=listaCategoriaInsumo rows=10 styleClass=pn_grid"

value=#{categoriaInsumoBean.resultList}" var=“categoriaInsumo”>

<f:facet name=header>

<p:columnGroup>

<p:column breakRowBefore=true"

sortBy=${categoriaInsumo.nomeCategoria}

sortOrder=#{categoriaInsumoBean.orderPorNome}">
<p:commandLink value="#{msgs['categoria.insumo.nome']}"
								render=":listaCategoriaInsumo"
								action="#{categoriaInsumoBean.ordenarPorNome()}" />
			</p:column>
			<p:column>
				<h:outputText value="#{msgs['categoria.insumo.descricao']}" />
			</p:column>
			<p:column colspan="2"/>
		</p:columnGroup>
	</f:facet>
	<p:column>
		<h:outputText value="#{categoriaInsumo.nomeCategoria}" />
	</p:column>
	<p:column>
		<h:outputText value="#{categoriaInsumo.descricaoCategoria}" />
	</p:column>
	<p:column styleClass="cl_actions">
		<p:commandLink actionListener="#{categoriaInsumoBean.showForm()}">
			<f:setPropertyActionListener value="#{categoriaInsumo}"
							target="#{categoriaInsumoBean.categoriaVO}" />
			<h:graphicImage title="#{msgs['button.editar']}"
							value="/img/bt/edit.png" />
		</p:commandLink>
	</p:column>
	<p:column styleClass="cl_actions">
		<p:commandLink actionListener="#{categoriaInsumoBean.excluir(categoriaInsumo)}"
						update="listaCategoriaInsumo" immediate="true">
			<f:setPropertyActionListener
							value="#{categoriaInsumo.codigoCategoria}"
							target="#{categoriaInsumoBean.categoriaVO.codigoCategoria}" />
			<h:graphicImage title="#{msgs['button.excluir']}"
							value="/img/bt/delete.png" />
		</p:commandLink>
	</p:column>

	<f:facet name="footer">
		<p:dataScroller for="listaCategoriaInsumo"
						id="dsListaCategoriaInsumo" maxPages="5" fastControls="auto" />
	</f:facet>
</p:dataTable>

MB

package br.com.forward.insumos.bean;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.forward.common.CategoriaInsumoVO;
import br.com.forward.interfaces.facade.CategoriaInsumoFacadeLocal;
import br.com.forward.util.Utils;

/**
 * Bean da tela categoriaInsumo.xhtml
 * 
 * @author Herberth Nilsen
 *
 */

@ViewScoped
@Named
public class CategoriaInsumoBean extends BasicBean {

	/**
	 * 
	 */
	private static final long serialVersionUID = 10150539659042223L;

	/** The Constant LOGGER. */
	public static final Logger LOGGER = Logger.getLogger("CategoriaInsumoBean.class");

	private List<CategoriaInsumoVO> resultList = new ArrayList<CategoriaInsumoVO>();

	private CategoriaInsumoVO categoriaVO = new CategoriaInsumoVO();

//	
//	private SortOrder orderPorCodigo = SortOrder.unsorted;
//
//	private SortOrder orderPorNome = SortOrder.unsorted;

	@Inject
	private CategoriaInsumoFacadeLocal categoriaInsumoFacade;

	@PostConstruct
	public void init() {
		LOGGER.info("CategoriaInsumoBean.init - INICIO");
		if (Utils.isEmpty(this.resultList)) {

			this.pesquisar();

		}
		LOGGER.info("CategoriaInsumoBean.init - FIM");
	}

	public void pesquisar() {
		LOGGER.info("CategoriaInsumoBean.pesquisar - INICIO");
		this.resultList = this.categoriaInsumoFacade.carregarCategoriaInsumos();
		LOGGER.info("CategoriaInsumoBean.pesquisar - FIM");
	}

	public void salvar() {
		LOGGER.info("CategoriaInsumoBean.salvar - INICIO = " + this.categoriaVO);
		this.categoriaInsumoFacade.salvar(this.categoriaVO);
		this.pesquisar();
		this.reset();
		this.hideForm();
		LOGGER.info("CategoriaInsumoBean.salvar - FIM");
	}

	public void excluir() {

		LOGGER.info("CategoriaInsumoBean.excluir - INICIO = " + this.categoriaVO);
		this.hideForm();
		this.categoriaInsumoFacade.excluir(this.categoriaVO);
		this.reset();
		this.pesquisar();
		LOGGER.info("CategoriaInsumoBean.excluir - FIM= " + this.categoriaVO);

	}

	@Override
	public void showForm() {

		this.reset();
		super.showForm();

	}

	public void reset() {

		this.categoriaVO = new CategoriaInsumoVO();

	}

	public String ordenarPorNome() {
//TODO
//		orderPorCodigo = SortOrder.unsorted;
//this.pesquisar();
//		if (this.orderPorNome.equals(SortOrder.ascending)) {
//
//			this.orderPorNome = SortOrder.descending;
//
//		} else {
//
//			this.orderPorNome = SortOrder.ascending;
//
//		}
		
		return null;

	}

	public void ordernarPorDescricao() {
//TODO
//		this.orderPorNome = SortOrder.unsorted;
//
//		if (this.orderPorCodigo.equals(SortOrder.ascending)) {
//
//			this.orderPorCodigo = SortOrder.descending;
//
//		} else {
//
//			this.orderPorCodigo = SortOrder.descending;
//
//		}

	}

	public List<CategoriaInsumoVO> getResultList() {
		return resultList;
	}

	public void setResultList(List<CategoriaInsumoVO> resultList) {
		this.resultList = resultList;
	}

	public CategoriaInsumoVO getCategoriaVO() {

		return this.categoriaVO;

	}

	public void setCategoriaVO(CategoriaInsumoVO categoriaVO) {
		this.categoriaVO = categoriaVO;
	}

//	TODO
//	public SortOrder getOrderPorCodigo() {
////		return orderPorCodigo;
//	}

//	public void setOrderPorCodigo(SortOrder orderPorCodigo) {
////		this.orderPorCodigo = orderPorCodigo;
//	}
//
//	public SortOrder getOrderPorNome() {
////		return orderPorNome;
//	}
//
//	public void setOrderPorNome(SortOrder orderPorNome) {
////		this.orderPorNome = orderPorNome;
//	}

}

Valeu pela ajuda

4 Respostas

L

tenta ajax = false

se não obtiver êxito trocao p:commandLink por h:commandLink

H
Solucao aceita

Lucciano01, valeu pela dica, mas não funcionou nem mudando para o h:commandLink, mas consegui achar o problema, mas não achei o porque.

O problema está no actionListener, eu mudei para somente action e funcionou normalmente tanto com p:commandLink quanto com o h:commandLink, quando estava com o actionListener não funcionou pra nenhum dos dois

Vou pesquisar o porque de não funcionar com o actionListener e só funcionar com o action.

mas valeu, vou resolver o tópico

L

o actionListener serve para quando vc quer permancer na mesma página, o action é para quando seu método possui um retorno que lhe direciona para outra pagina, por ex.

public String seuMetodo ( ){
// lógica

return “paginaDeDestino.xhtml”
}

se for actionListener ele realmente não executa, porém com action ao fina da execução do método vc será redirecionado para a panginaDestino.xhtml

H

Ai sim, valeu pela explicação

Só não entendi o porque de não funcionar na primeira chamada com o actionListener, deveria funcionar a atribuição do objeto.

Criado 8 de janeiro de 2016
Ultima resposta 10 de jan. de 2016
Respostas 4
Participantes 2