3

現在、Spring Boot と Vaadin を利用したサンプル実装を作成しようとしています。Spring Managed Bean で vaadin ナビゲーターを初期化しようとしましたが、UI オブジェクトにアクセスする必要があります。

多くのクラスとインターフェイスを必要とする 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 変数に保持されていることを既に読みました。デバッグで確認できました。有線 Bean MainPresenterが別のスレッドにある理由がわかりません。また、スコープの問題であってはなりません。

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

VAADIN wiki は役に立ちませんでした。このフォーラムでは役立つ回答を見つけることができませんでした。

4

1 に答える 1

2

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

この問題の解決策は、初期化の順序を念頭に置くことです。MainPresenterImpl@PostConstructが呼び出されたとき、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
    }
}
于 2016-05-20T11:11:32.090 に答える