在Spring托管Bean中,UI.getCurrent返回Null

在Spring托管Bean中,UI.getCurrent返回Null,spring,spring-boot,vaadin,vaadin4spring,Spring,Spring Boot,Vaadin,Vaadin4spring,目前,我尝试使用Spring Boot和Vaadin创建一个示例实现。我试图在spring管理的bean中初始化vaadin navigator,但因此需要访问UI对象 我实现了MVP模式,它需要很多类和接口,但问题归结为以下示例代码: @SpringUI public class MyVaadinUI extends UI { @Autowired private MainPresenter mainPresenter; protected void init(Vaa

目前,我尝试使用Spring Boot和Vaadin创建一个示例实现。我试图在spring管理的bean中初始化vaadin navigator,但因此需要访问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变量中。我可以通过调试来验证这一点。我不明白为什么wired beanMainPresenter位于不同的线程中。这也不应该是范围的问题

到目前为止,在我尝试访问Presenter中的UI实例之前,应用程序运行良好


VAADIN wiki没有帮助,我在这个论坛上找不到有用的答案。

几个小时后,我可以自己回答这个问题

此问题的解决方案是记住初始化顺序:当调用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
    }
}

你看过这张单子了吗?我之前看到的大部分搜索结果。90%的用户抱怨由于错误配置或在spring未实例化的对象中使用@Autowire而导致自动连接字段为空。最后10%也不符合我的问题。