ПРИМЕЧАНИЕ. Эта проблема может быть связана или не связана с Vaadin, в зависимости от того, существует ли «лучшее» решение для «сброса» bean-компонента или нет.
Фоновый сценарий
Я создаю мастер для ввода некоторых значений, которые по завершении отправляются в таблицу (используя Vaadin и надстройку «Мастера для Vaadin»).
Дополнение не предоставляет возможности сбросить мастер (т.е. вернуться к шагу 1) без принудительного вызова текущих шагов (переопределенных) методов onAdvance() и onBack(), которые вернут false на некоторых моих шагах. потому что я использую логику в этих методах на случай, если использование, например, не заполнило все необходимые данные.
Я не могу просто создать новый экземпляр мастера, потому что я использую Spring для управления этим @Component.
Итак, это оставляет мне фактический сброс bean-компонента, чтобы правильно сбросить мастер.
Мой вопрос
Как «сбросить» управляемый компонент Spring (@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);
}
}