如何重置Spring托管Bean

时间:2014-01-07 14:39:49

标签: java spring vaadin vaadin7

注意:这个问题可能与Vaadin相关,也可能不相关,具体取决于是否有“更好”解决“重置”bean的问题。

背景情景

我正在构建一个向导来输入一些值,这些值在完成后会被发送到一个表(使用Vaadin和附加的“Wizards for Vaadin”)。

加载项不提供重置向导的方法(即返回步骤1),而不强制调用onAdvance()和onBack()方法的当前步骤(重写),这些方法将返回false我的步骤是因为我在这些方法中使用逻辑,以防例如用途没有填写所有必需的数据。

我不能简单地创建一个新的Wizard实例,因为我使用Spring来管理这个@Component。

因此,这使我实际上重置了bean,以便正确地重置向导。

我的问题是

如何“重置”Spring托管Bean(@Component)?我应该补充一点,这个Bean也有一些依赖注入它。

或......(对于Vaadin人):

除了创建新向导之外,还有其他方法可以重置此向导吗?

部分代码

@Component
@Scope("session")
public class MyWizard extends Wizard {

    @Inject
    private MyWizardContainer myWizardContainer;
    @Inject
    private MyService myService;
    @Inject
    private MyWizardStep1 myWizardStep1;
    @Inject
    private MyWizardStep2 myWizardStep2;
    @Inject
    private MyWizardStep3 myWizardStep3;
    @Inject
    private MyMainTableContainer myMainTableContainer;

    final static Logger logger = LoggerFactory.getLogger(MyWizard.class);

    private static final long serialVersionUID = 1L;

    public MyWizard() {
        setupListener();
    }

    public void addSteps() {
        this.addStep(myWizardStep1);
        this.addStep(myWizardStep2);
        this.addStep(myWizardStep3);
        this.mainLayout.setComponentAlignment(this.footer, Alignment.BOTTOM_LEFT);
    }

    private void setupListener() {

        this.addListener(new WizardProgressListener() {

            @Override
            public void wizardCompleted(WizardCompletedEvent event) {
                endWizard("Wizard Finished Successfully!");
            }

            @Override
            public void wizardCancelled(WizardCancelledEvent event) {
                endWizard("Wizard Cancelled!");
            }

            @Override
            public void stepSetChanged(WizardStepSetChangedEvent event) {
                // TODO Auto-generated method stub
            }

            @Override
            public void activeStepChanged(WizardStepActivationEvent event) {
                // TODO Auto-generated method stub
            }
        });
    }

    private void resetWizard() {
        myWizardContainer.removeAll(); //here I'm simply resetting all data that the user generated thus far in the wizard
        this.activateStep(myWizardStep1); //this will not work, as some steps will not always return true on onBack() and/or onAdvance()
    }

    private void endWizard(String message) {
        resetWizard();
        this.setVisible(false);
        Notification.show(message);
    }
}

1 个答案:

答案 0 :(得分:2)

您可能使用的SpringVaadinIntegration不要求所有元素都是@Components,只需要注释UI。

在这种情况下,你的向导和它的步骤不应该是组件,如果你真的需要在它们中注入依赖项,你可以使用@Configurable注释,这允许将依赖项注入不由Spring管理的类(需要更多的配置)这行得通)。只需在需要时创建向导和步骤作为新对象。