2017-07-04 8 views
1

は、私は次のように定義され、Vaadinスプリング注釈@UIScopeで問題に直面しています:@UIScope注釈はスプリングビューには尊重されていませんか?

@SpringComponent 
@SpringView(name = AdminView.VIEW_NAME) 
@UIScope 
public class AdminView extends NavigatingView { 
    ... 
} 

ビューには、ナビゲーションビューを開いているたびに作成されます。初めてのアクセスでは一度だけ作成されることが期待されます。

ただし、@UIScope@Scope(UIScopeImpl.VAADIN_UI_SCOPE_NAME)に置き換えた場合、期待どおりに動作します。私は何か見落としてますか?

答えて

3

tutorialと古いwiki page簡単にが示唆するようこれは、@SpringView@UIScope注釈のオーダーに近い関連:

//それだ注釈

の順序に注意してくださいおそらくアノテーションがいつどのように処理されるかに関係しています。私はVaadinコードを深く掘り下げませんでしたが、@SpringView javadocによれば、ビューはビュースコープにデフォルト設定されています。さらに、を使用してスプリングコンポーネントを登録しているため、@SpringComponent注釈は必要ないと思います。

注釈は、SpringViewProviderで処理する必要があるView-Classに配置する必要があります。

この注釈もステレオタイプ注釈であるため、Springは注釈付きクラスを自動的に検出します。 デフォルトでは、この注釈はビューをビュースコープに配置します。ビュークラスのUIスコープなど、別のスコープアノテーションを使用してこれをオーバーライドすることができます。しかし、シングルトンスコープは動作しません!あなたが気づくのよう

@SpringUI 
@SpringViewDisplay 
public class MyVaadinUI extends UI implements ViewDisplay { 

    /* UI */ 

    private Panel springViewDisplay; 

    @Override 
    protected void init(VaadinRequest request) { 
     VerticalLayout mainLayout = new VerticalLayout(); 
     HorizontalLayout buttonLayout = new HorizontalLayout(); 
     springViewDisplay = new Panel(); 

     buttonLayout.addComponent(new Button("1", event -> getNavigator().navigateTo(FirstView.VIEW_NAME))); 
     buttonLayout.addComponent(new Button("2", event -> getNavigator().navigateTo(SecondView.VIEW_NAME))); 
     mainLayout.addComponents(buttonLayout, springViewDisplay); 
     setContent(mainLayout); 

    } 

    @Override 
    public void showView(View view) { 
     springViewDisplay.setContent((Component) view); 
    } 


    /* VIEWS */ 

    @UIScope 
    @SpringView(name = FirstView.VIEW_NAME) 
    public static class FirstView extends HorizontalLayout implements View { 

     public static final String VIEW_NAME = ""; 

     @PostConstruct 
     private void init() { 
      System.out.println("Created first view"); 
      addComponent(new Label("First view - " + LocalDateTime.now())); 
     } 

     @Override 
     public void enter(ViewChangeListener.ViewChangeEvent event) { 
      // no-op 
     } 
    } 

    @SpringView(name = SecondView.VIEW_NAME) 
    @UIScope 
    public static class SecondView extends HorizontalLayout implements View { 

     public static final String VIEW_NAME = "secondView"; 

     @PostConstruct 
     private void init() { 
      System.out.println("Created second view"); 
      addComponent(new Label("Second view - " + LocalDateTime.now())); 
     } 

     @Override 
     public void enter(ViewChangeListener.ViewChangeEvent event) { 
      // no-op 
     } 
    } 
} 

:以下のサンプルで

、あなたは2つのビュー、正しい順序で注釈を持つ最初の1、およびスワップ彼らと二番目を見つけることができますあなたの詳細な回答のため

vaadin-view-uiscope

+0

ありがとう:最初の1に移動すると、最初のインスタンスを再利用します一方、2番目のビューに新しいインスタンスをナビゲート下のアニメーションは、常に、作成されます。しかし、順序が重要であることは変です。 –

+0

@SteffenHarbichええ。しかし同時に、デフォルトのSpringの '@Scope'アノテーションは反復可能ではないので、同じBeanに2つのスコープを追加することはできません。しかし、 '@ UIScope'と' @ SpringView'の両方がビューのスコープを設定していますので、**私はどちらかが優先的に優先されなければならないと思っています...私が言ったように、また、複数のスコープが適用されているインスタンス/サンプルを見つけることもできないので、それは野生の推測です – Morfic

関連する問題