gpt4 book ai didi

java - 如何重置 Spring 托管 Bean

转载 作者:行者123 更新时间:2023-12-02 06:21:24 24 4
gpt4 key购买 nike

注意:此问题可能与 Vaadin 相关,也可能无关,具体取决于是否有“更好”的解决方案来“重置”bean。

背景场景

我正在构建一个向导,用于输入一些值,完成后,将其发送到表格(使用 Vaadin 和附加组件“Wizards for Vaadin”)。

该插件不提供重置向导的方法(即返回步骤 1),而无需强制调用当前步骤(覆盖)的 onAdvance() 和 onBack() 方法,这在某些情况下会返回 false我的步骤,因为我在这些方法中使用逻辑,以防万一使用例如没有填写所有必需的数据。

我无法简单地创建向导的新实例,因为我正在使用 Spring 来管理这个 @Component。

因此,这让我需要实际重置 Bean,以便正确重置向导。

我的问题是

如何“重置”Spring 管理的 Bean (@Component)?我应该补充一点,这个 Bean 还注入(inject)了一些依赖项。

或者...(对于 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);
}
}

最佳答案

您可能使用的 SpringVaadinIntegration 并不要求所有元素都为 @Component,只需对 UI 进行注释。

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

关于java - 如何重置 Spring 托管 Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20974420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com