2014-01-07 5 views
0

ПРИМЕЧАНИЕ: Эта проблема может быть или не быть связана с Ваадином, в зависимости от того, существует ли «лучшее» решение для «сброса» компонента или нет.Как сбросить весенний бобин

Фоновая сценарий

Я строю мастера для ввода нескольких значений, которые, когда закончено, отправляется в таблицу (с помощью Vaadin и надстройку «Wizards для Vaadin»).

Это дополнение не предоставляет способ сбросить настройки мастера (т.е. вернуться к шагу 1) без принудительного вызова текущих шагов (переопределенных) методов onAdvance() и onBack(), которые вернут false в некоторые из моих шагов, потому что я использую логику в этих методах, если использование, например, не заполнило все требуемые данные.

Я не могу создать новый экземпляр мастера, потому что я использую Spring для управления этим @Component.

Итак, это оставляет меня с фактическим сбросом компонента, чтобы правильно восстановить мастер.

Мой вопрос

Как "сбросить" родника удалось 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); 
    } 
} 

ответ

2

SpringVaadinIntegration, что вы, вероятно, использовать, не требует, чтобы все элементы, чтобы быть @Components, только пользовательский интерфейс должен быть примеч.

Ваш мастер и его шаги не должны быть компонентами в этом случае, если вам действительно нужно встраивать в них зависимости, вы можете использовать аннотацию @Configurable, которая позволяет вводить зависимости классам, не управляемым Spring (требуется еще одна конфигурация, необходимая для сделай так, чтоб это работало). Просто создайте мастер и выполните шаги как новые объекты, когда они вам понадобятся.

+0

Ваше предложение звучит разумно, и вы правы в своем предположении, что я использую SVI. У меня было чувство, что я делаю что-то неправильно здесь, также я не знал о аннотации @Configuration. Я попробую это первое завтра и вернусь к результатам! Благодаря! – Roger

+0

Я не понимаю, как настроить '@ Configuration', чтобы заставить' Wizard' (POJO) принять '@ Inject'. Я создал простой пример после чтения в документации Spring '@ Configuration', используя аннотированный класс AppConfig' @ Configuration', который создает «новый мастер» и простой «@ Component», который должен иметь «Мастер» использовать ('MyService'). Однако в документации не упоминается ничего (что я мог найти) при фактическом вводе компонента (например, «MyService») в «POJO-ized» 'Wizard'. Когда я пытаюсь, я получаю «BeanCreationException». Любые подсказки? – Roger

+0

Извините, я отредактировал позже, аннотация @Configurable – dzezzz

Смежные вопросы