setPropertyActionListener 在操作后不工作

setPropertyActionListener not working after a action

我有一个包含对象列表的网格,我正在尝试创建一个基本的 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() 上,我无法访问 属性,因为它总是为空。对这个问题有什么想法吗?

你可以替换

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

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

并在您的 actionListenerMethod 中获取属性:

this.aplicacaoSelecionada = ((AplicacaoVO) event.getComponent().getAttributes().get("aplicacao"));

您的具体问题是由于(滥用)使用 actionListener 而不是 action 来执行业务操作造成的。所有 actionListener 的调用顺序与它们附加到组件上的顺序完全相同,然后最后 action 被调用。

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

actionListener 修正为 action

action="#{aplicacoesMB.editarAplicacao}"

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

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

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

另请参阅:

  • Differences between action and actionListener
  • How can I pass selected row to commandLink inside dataTable?