繁体   English   中英

如何重置Spring托管Bean

[英]How to reset a Spring managed Bean

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

背景情景

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

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

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

所以,这让我实际上重置了bean,以便正确地重置向导。

我的问题是

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

或者......(对于瓦丁人来说):

除了创建新向导之外,还有另一种重置此向导的方法吗?

一些代码

@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);
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM