一个动作后setPropertyActionListener不工作

时间:2015-03-06 13:03:55

标签: jsf setpropertyactionlistener

我有一个包含对象列表的网格,我正在尝试创建一个基本的CRUD。更新和删除都很顺利,没有任何问题,但是,当我尝试对所选对象执行编辑时,我设置的setPropertyActionListener未按预期执行。我在几个主题上搜索过但没有成功。

这是我的代码:

在我的crud-aplicacoes.html上,我有一个网格,这是我的按钮的代码,我设置了我的setPropertyActionListener以及我的行为,这是另一个页面的action ="editar-aplicacao"。我的财产aplicacaoSelecionada始终为空。

<p:commandButton icon="ui-icon-pencil"
                        title="#{msg['label.button.editar']}" action="editar-aplicacao"
                        actionListener="#{aplicacoesMB.editarAplicacao}">
                        <f:setPropertyActionListener
                            target="#{aplicacoesMB.aplicacaoSelecionada}" value="#{app}" />

                    </p:commandButton>

我的托管bean:

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

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;

import org.primefaces.model.DualListModel;

import br.com.cnen.enums.SituacaoAplicacaoeEnum;
import br.com.cnen.vo.AplicacaoVO;
import br.com.cnen.vo.PerfilVO;
import br.com.cnen.web.facade.AplicacoesFacade;

@RequestScoped
@ManagedBean(name = "aplicacoesMB")
public class AplicacoesMB extends BeanAbstract {


    private static final long serialVersionUID = 1L;

    private List<AplicacaoVO> listaAplicacoes;

    private AplicacaoVO aplicacaoSelecionada;

    private PerfilVO perfilSelecionado;

    private boolean edicaoExibicao;

    @Inject
    private AplicacoesFacade facadeAplicacao;

    private List<PerfilVO> source;
    private List<PerfilVO> target;
    private DualListModel<PerfilVO> dualListPerfil;

    @PostConstruct
    public void carregarAplicacoes() {
        listaAplicacoes = facadeAplicacao.listarTodos();
        this.edicaoExibicao = false;
        dualListPerfil = new DualListModel<PerfilVO>();
    }

    public List<PerfilVO> perfis() {
        return facadeAplicacao.carregarComboPerfis();
    }

    public List<SituacaoAplicacaoeEnum> comboStatus() {
        List<SituacaoAplicacaoeEnum> lista = new ArrayList<SituacaoAplicacaoeEnum>();
        for (SituacaoAplicacaoeEnum current : SituacaoAplicacaoeEnum.values()) {
            lista.add(current);
        }
        return lista;
    }

    public String editarAplicacao() {
        this.edicaoExibicao = false;
        pickList();
        return "editar-aplicacao";
    }

    public String visualizarAplicacao() {
        this.edicaoExibicao = true;
        return "editar-aplicacao";
    }

    public void excluirAplicacao() {
        facadeAplicacao.remover(this.aplicacaoSelecionada);
        this.carregarAplicacoes();
        this.addMensagem("A exclusão foi realizada com sucesso.", FacesMessage.SEVERITY_INFO);
    }

    public void bloquearAplicacao() {
        this.aplicacaoSelecionada.setSituacao(SituacaoAplicacaoeEnum.BLOQUEADO);
        facadeAplicacao.bloquear(this.aplicacaoSelecionada);
        this.addMensagem("O bloqueio foi realizado com sucesso!", FacesMessage.SEVERITY_INFO);
    }

    public void desbloquearAplicacao() {
        this.aplicacaoSelecionada
                .setSituacao(SituacaoAplicacaoeEnum.DESBLOQUEADO);
        facadeAplicacao.desbloquear(this.aplicacaoSelecionada);
        this.addMensagem("O desbloqueio com sucesso!", FacesMessage.SEVERITY_INFO);
    }

    public void alterarAplicacao(){
        facadeAplicacao.alterar(aplicacaoSelecionada);
        this.addMensagem("O atualização foi realizada com sucesso!", FacesMessage.SEVERITY_INFO);
    }

    public void addPerfil(){

    }

    public void pickList(){
        source = facadeAplicacao.carregarComboPerfis();
        target = new ArrayList<PerfilVO>();

        if(aplicacaoSelecionada!=null)
            target = aplicacaoSelecionada.getListaPerfis();
        dualListPerfil = new DualListModel<PerfilVO>(source, target);
    }

    /**
     * 
     * Getts and setters
     * 
     */
    public List<AplicacaoVO> getListaAplicacoes() {
        return listaAplicacoes;
    }

    public AplicacaoVO getAplicacaoSelecionada() {
        return aplicacaoSelecionada;
    }

    public void setAplicacaoSelecionada(AplicacaoVO aplicacaoSelecionada) {
        this.aplicacaoSelecionada = aplicacaoSelecionada;
        System.out.println("-> "+ aplicacaoSelecionada.getAplicaoId());
    }

    public PerfilVO getPerfilSelecionado() {
        return perfilSelecionado;
    }

    public void setPerfilSelecionado(PerfilVO perfilSelecionado) {
        this.perfilSelecionado = perfilSelecionado;
    }

    public boolean isEdicaoExibicao() {
        return edicaoExibicao;
    }

    public List<PerfilVO> getSource() {
        return source;
    }

    public void setSource(List<PerfilVO> source) {
        this.source = source;
    }

    public List<PerfilVO> getTarget() {
        return target;
    }

    public void setTarget(List<PerfilVO> target) {
        this.target = target;
    }

    public DualListModel<PerfilVO> getDualListPerfil() {
        return dualListPerfil;
    }

    public void setDualListPerfil(DualListModel<PerfilVO> dualListPerfil) {
        this.dualListPerfil = dualListPerfil;
    }


}

在我的editarAplicacao()我无法访问该属性,因为它始终为null。有关这个问题的任何想法吗?

2 个答案:

答案 0 :(得分:3)

您的具体问题是由(ab)使用actionListener而非action执行商业操作引起的。所有actionListener的调用顺序与它们在组件上附加的顺序相同,然后最终调用action

换句话说,<f:setPropertyActionListener>在您的特定情况下会在 #{aplicacoesMB.editarAplicacao}之后调用,这完全解释了您在未设置属性时看到的症状

actionListener修改为action

action="#{aplicacoesMB.editarAplicacao}"

此外,您还可以完全删除<f:propertyActionListener>并将该属性作为操作方法参数传递。

action="#{aplicacoesMB.editarAplicacao(app)}"

public String editarAplicacao(AplicacaoVO aplicacaoSelecionada) {
    // ...
}

另见:

答案 1 :(得分:0)

您可以替换

<f:setPropertyActionListener
                            target="#{aplicacoesMB.aplicacaoSelecionada}" value="#{app}" />

<f:attribute name="aplicacao" value="#{app}"></f:attribute>

并在actionListenerMethod获取属性:

this.aplicacaoSelecionada =((AplicacaoVO)event.getComponent()。getAttributes()。get(“aplicacao”));