Send a ListEntity in Redirect

1

I have a List and I need to send it to another page to fill a table, how much the redirect ends the page loads but the table does not fill because the List has been emptied, how do I keep it with the information?

MinhaBean

@ManagedBean(name = "lotesEnvBean")
@ViewScoped
public class LoteEnviadoBean implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private LoteEnvRepository envRepository;

    private List<LoteEnvEntity> lotesEnviados;
    private List<LoteEnvEntity> lotesSelecionados = new ArrayList<LoteEnvEntity>();
    private List<LoteEnvDetalheEntity> lotesEnvDetalhe;
    private Collection<Object> selecao;

    private Date dataDe;
    private Date dataAte;
    private Flash flash;

    private UIComponent component;

    @PostConstruct
    public void init() {
        this.lotesEnviados = envRepository.findall();
    }

    public void selectionListener(AjaxBehaviorEvent event) {
        AbstractExtendedDataTable dataTable = (AbstractExtendedDataTable) event
            .getComponent();
        Object originalKey = dataTable.getRowKey();
        lotesSelecionados.clear();
        for (Object selectionKey : selecao) {
            dataTable.setRowKey(selectionKey);
            if (dataTable.isRowAvailable()) {
                lotesSelecionados.add((LoteEnvEntity) dataTable.getRowData());
            }
        }
        dataTable.setRowKey(originalKey);
    }

    public Collection<Object> getSelecao() {
        return selecao;
    }

    public void setSelecao(Collection<Object> selecao) {
        this.selecao = selecao;
    }

    public void setSelectionItems(List<LoteEnvEntity> selectionItems) {
        this.lotesSelecionados = selectionItems;
    }

    public List<LoteEnvEntity> getLotesEnviados() {
        return lotesEnviados;
    }

    public void setLotesEnviados(List<LoteEnvEntity> lotesEnviados) {
        this.lotesEnviados = lotesEnviados;
    }

    public List<LoteEnvEntity> getLotesSelecionados() {
        return lotesSelecionados;
    }

    public Date getDataDe() {
        return dataDe;
    }

    public void setDataDe(Date dataDe) {
        this.dataDe = dataDe;
    }

    public Date getDataAte() {
        return dataAte;
    }

    public void setDataAte(Date dataAte) {
        this.dataAte = dataAte;
    }

    public void setLotesSelecionados(List<LoteEnvEntity> lotesSelecionados) {
        this.lotesSelecionados = lotesSelecionados;
    }

    public List<LoteEnvDetalheEntity> getLotesEnvDetalhe() {
        return lotesEnvDetalhe;
    }

    public void setLotesEnvDetalhe(List<LoteEnvDetalheEntity> lotesEnvDetalhe) {
        this.lotesEnvDetalhe = lotesEnvDetalhe;
    }

    public UIComponent getComponent() {
        return component;
    }

    public void setComponent(UIComponent component) {
        this.component = component;
    }

    public Flash getFlash() {
        return flash;
    }

    public void setFlash(Flash flash) {
        this.flash = flash;
    }

    public List<LoteEnvEntity> findByDate() {
        this.lotesEnviados = envRepository.findallByDate(this.dataDe,
            this.dataAte);
        return this.lotesEnviados;
    }

    public String exibirLotesSelecionados() {

        FacesContext context = FacesContext.getCurrentInstance();
        System.out.println("#########################################################----" + this.lotesSelecionados.size());
        if(this.lotesSelecionados.size() <= 0) {
            context.addMessage(component.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro","Deve-se selecionar ao menos um lote."));
            return "";
        }

        this.lotesEnvDetalhe = this.envRepository.exibirLotesSelecionados(this.lotesSelecionados);


        if (this.lotesEnvDetalhe.size() > 0)
            return "lotesEnviadosListagem.xhtml?faces-redirect=true";
        else
            context.addMessage(component.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro","Não foi possível exibir o(s) lote(s)."));

            return "";
        }
    }
}
    
asked by anonymous 06.11.2014 / 16:22

1 answer

2

% w / w% is often used when you want to keep data accessible only until the next request . This is advantageous if, at the end of an action of a Flash Scope , you redirect to another page and need to pass data to that new page.

During the action of Managed Bean , before navigation occurs, you can store data in Bean and retrieve it on the next request, which will actually render the contents of the Flash Scope that you redirected.

The data stored in View will only last until the next request , after that it will be deleted. This is because the storage is done in the session and then removed at the end of the subsequent request .

Practical example:

public String exibirLotesSelecionados() {

    FacesContext context = FacesContext.getCurrentInstance();

    if(this.lotesSelecionados.size() <= 0) {
        context.addMessage(component.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro","Deve-se selecionar ao menos um lote."));

        return "";
    }

    this.lotesEnvDetalhe = this.envRepository.exibirLotesSelecionados(this.lotesSelecionados);


    if (this.lotesEnvDetalhe.size() > 0) {
         // Adiciono a lista no Flash Scope para o proximo Bean recuperar
        context.getExternalContext().getFlash().put("lista", lotesSelecionados);
        return "lotesEnviadosListagem.xhtml?faces-redirect=true";
    } else {
        context.addMessage(component.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro","Não foi possível exibir o(s) lote(s)."));
    }

    return "";
}

No Flash Scope of PostConstruct of Managed Bean

@PostConstruct
public void init() {
    List<LoteEnvDetalheEntity> lotesEnviados = (List<LoteEnvDetalheEntity>) FacesContext.getInstance().getExternalContext().getFlash().get("lista");

    // Guardar a lista para usar no dataTable
}

More details in the documentation for lotesEnviadosListagem.xhtml

    
08.11.2014 / 01:10