2016-05-20 9 views
3

現在、私はSpring BootとVaadinを利用してサンプル実装を作成しようとしています。私は春のマネージドBeanでvaadinナビゲータを初期化しようとしましたが、UIオブジェクトにアクセスする必要があります。 UI.getCurrentは、Spring管理対象BeanでNullを返します

は、私はクラスとインタフェースの多くを必要とMVPパターンを実装しますが、問題は、次のサンプルコードに沸く:

@SpringUI 
public class MyVaadinUI extends UI 
{ 
    @Autowired 
    private MainPresenter mainPresenter; 

    protected void init(VaadinRequest request) 
    { 
     setContent(mainPresenter.getView()); 
    } 
} 

@UIScope 
@SpringComponent 
public class MainPresenterImpl implements MainPresenter 
{ 
    @Autowired 
    public MainPresenterImpl(MainModel model, MainView view) 
    { 
     super(model, view); 
    } 

    @PostConstruct 
    public void init() 
    { 
     UI ui = UI.getCurrent(); 
     Assert.isNull(ui); // ui is always null 
    } 
} 

私はすでにUIのインスタンスはThreadLocal変数に保持されていることを読みました。私はそれをデバッグによって確認できました。私はなぜ有線豆MainPresenterが別のスレッドにあるのか分からない。それはまた、スコープの問題であってはならない。

これまでのところ、PresenterのUIインスタンスにアクセスしようとするまで、アプリケーションは正常に動作します。

VAADINのwikiは役に立たず、私はこのフォーラムで有益な答えを見つけることができませんでした。

+0

このリストを確認しましたか? http://stackoverflow.com/search?q=vaadin+spring+autowire+null –

+0

私が以前に見た検索結果のほとんど。 90%は誤設定のためにnullであるautowiredフィールドやSpringでインスタンス化されていないオブジェクトで@Autowireを使用していると不平を言っています。最後の10%は私の問題にも一致しません。 –

答えて

2

数時間後、私は自分自身でこれに答えることができます。

この問題を解決するには、心の中で初期化の順序を保っている。のとき@PostConstruct MainPresenterImplは何のUIはまだありませんと呼ばれ、UIはまだThreadLocalのインスタンスに登録されていません。

@SpringUI 
public class MyVaadinUI extends UI 
{ 
    @Autowired 
    private MainPresenter mainPresenter; 

    protected void init(VaadinRequest request) 
    { 
     mainPresenter.initAfterBeanCreation() 
     setContent(mainPresenter.getView()); 
    } 
} 

@UIScope 
@SpringComponent 
public class MainPresenterImpl implements MainPresenter 
{ 
    @Autowired 
    public MainPresenterImpl(MainModel model, MainView view) 
    { 
     super(model, view); 
    } 

    @PostConstruct 
    public void init() 
    { 
     UI ui = UI.getCurrent(); // ui is always null 
    } 

    public void initAfterBeanCreation() 
    { 
     UI ui = UI.getCurrent(); // now ui is not null 
    } 
} 
関連する問題