Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @viewscope bean意外存活_Java_Xml_Spring_Icefaces_Spring Webflow - Fatal编程技术网

Java @viewscope bean意外存活

Java @viewscope bean意外存活,java,xml,spring,icefaces,spring-webflow,Java,Xml,Spring,Icefaces,Spring Webflow,我正在开发一个视图,它由对象创建表单和现有对象列表creablocco.xhtml组成: 因此,当一个流的新实例启动时,应该从头开始重新创建它 我已经试过使用示波器了,但没有解决问题 为了完整起见,我提到了BlocchiBean对象之前的注释: @Component("blocchiBean") @ViewScoped public class BlocchiBean implements Serializable { 我的目标是将组件名与视图和流中使用的bean名相匹配。不幸的是,这个注

我正在开发一个视图,它由对象创建表单和现有对象列表creablocco.xhtml组成:

因此,当一个流的新实例启动时,应该从头开始重新创建它

我已经试过使用示波器了,但没有解决问题

为了完整起见,我提到了BlocchiBean对象之前的注释:

@Component("blocchiBean")
@ViewScoped
public class BlocchiBean implements Serializable {  
我的目标是将组件名与视图和流中使用的bean名相匹配。不幸的是,这个注释也不能解决问题。

我找到了补救办法。
我还不能完全解释为什么我的问题中提供的解决方案不起作用,但至少我找到了一个正确的解决方案

我在流中声明了一个流变量:

<var name="blocchiBean" class="com.infoone.siglo.viewbeans.BlocchiBean" />
对于那些这样做的人,不要在xml配置文件中将其显式声明为bean。它必须是一个弹簧流量变量,而不是其他变量

它现在起作用了。无论如何,不要期望SpringWebFlow在同一个流实例中始终使用相同的BlocchiBean对象,即使它本身是流范围的(它是一个流变量,因此它是流范围的)。
实际上,如果运行调试器并查看对象ID,您会发现SpringWebFlow在同一个流实例中使用不同的实例。一开始听起来很奇怪,但最终它还是起作用了:事实上,每次对bean实例进行垃圾收集时,它的状态都会被正确地保存在“某处”,这样就可以在实例化之后,通过它的setter方法设置同一流执行中的下一个实例的状态


显然,如果流的另一个实例启动,将构造一个新的流变量,并且不会通过调用其setter方法来更改其状态。换句话说,它的行为将与预期的FlowScope变量的行为相同。

简单猜测一下:组件是spring注释,ViewScope是JSF注释。因此,当Spring实例化bean时,它使用默认的“singleton”作用域。
package com.infoone.siglo.viewbeans;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentSkipListSet;

import javax.annotation.PostConstruct;
import javax.faces.bean.ViewScoped;

import org.icefaces.ace.component.column.Column;
import org.icefaces.ace.component.datatable.DataTable;
import org.icefaces.ace.event.SelectEvent;
import org.icefaces.ace.event.UnselectEvent;
import org.icefaces.ace.model.table.RowState;
import org.icefaces.ace.model.table.RowStateMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.infoone.siglo.viewbeans.lazyLoaders.BlocchiLazyLoader;

@Component
@ViewScoped
public class BlocchiBean implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -7007046069743684498L;

    @Autowired
    private transient BlocchiLazyLoader blocchi;
    private DataTable table;
    private RowStateMap stateMap;
    private Set<CreaBloccoBean> righeSelezionate;
    private boolean modificaInCorso;

    public BlocchiBean()
    {
    }

    @SuppressWarnings("unused")
    @PostConstruct
    private void initBlocchi()
    {
        stateMap = new RowStateMap();
        stateMap.setAllSelectable(true);

        righeSelezionate = new ConcurrentSkipListSet<CreaBloccoBean>();

        blocchi.setRowCount(blocchi.getPageSize());

        modificaInCorso = false;
    }

    //BlocchiLazyLoader blocchi
    public void setBlocchi(BlocchiLazyLoader blocchi) {
        this.blocchi = blocchi;
    }   
    public BlocchiLazyLoader getBlocchi() {
        return blocchi;
    }

    //RowStateMap stateMap
    public RowStateMap getStateMap() {
        return stateMap;
    }
    public void setStateMap(RowStateMap stateMap) {
        this.stateMap = stateMap;
    }

    //DataTable table
    public DataTable getTable() {
        return table;
    }
    public void setTable(DataTable table) {
        this.table = table;
    }

    //Selection listeners
    public void selectListener(SelectEvent event) {
        Object[] oggettiSelezionati = event.getObjects();
        for (Object oggettoSelezionato : oggettiSelezionati) {
            CreaBloccoBean bloccoSelezionato = (CreaBloccoBean) oggettoSelezionato;
            righeSelezionate.add(bloccoSelezionato);
        }
    }

    public void deselectListener(UnselectEvent event) {
        Object oggettoDeselezionato = event.getObject();
        CreaBloccoBean bloccoDeselezionato = (CreaBloccoBean) oggettoDeselezionato;
        righeSelezionate.remove(bloccoDeselezionato);
    }

    //List<CreaBloccoBean> righeSelezionate
    public List<CreaBloccoBean> getRigheSelezionate() {
        CreaBloccoBean[] array = new CreaBloccoBean[righeSelezionate.size()];
        array = righeSelezionate.toArray(array);
        return Arrays.asList(array);
    }
    public void setRigheSelezionate(List<CreaBloccoBean> righeSelezionate) {
        this.righeSelezionate.clear();
        this.righeSelezionate.addAll(righeSelezionate);
    }

    public boolean isModificaInCorso() {
        return modificaInCorso;
    }

    public void setModificaInCorso(boolean modificaInCorso) {
        this.modificaInCorso = modificaInCorso;
    }

    //Abilitazione dell'editing
    public void abilitaModifica() {
        if (!righeSelezionate.isEmpty())
        {
            modificaInCorso = true;
            List<Column> colonne = table.getColumns();
            for (Object oggettoCorrente : stateMap.getSelected()) {
                CreaBloccoBean beanCorrente = (CreaBloccoBean) oggettoCorrente;
                RowState statoCorrente = stateMap.get(beanCorrente);
                if (righeSelezionate.contains(beanCorrente)) {
                    for (Column colonna : colonne) {
                        statoCorrente.addActiveCellEditor(colonna.getCellEditor());
                    }
                }
            }
        }
    }
}
@Component
@ViewScoped
public class BlocchiBean implements Serializable {  
@Component("blocchiBean")
@ViewScoped
public class BlocchiBean implements Serializable {  
<var name="blocchiBean" class="com.infoone.siglo.viewbeans.BlocchiBean" />
package com.infoone.siglo.viewbeans;
//imports
public class BlocchiBean implements Serializable {