UI.getCurrent Returns 空 Spring 托管 Bean
UI.getCurrent Returns Null In Spring Managed Bean
目前,我尝试使用 Spring Boot 和 Vaadin 创建示例实现。我试图在 spring 托管 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 没有帮助,我在这个论坛中找不到有用的答案。
几个小时后我可以自己回答这个问题。
这个问题的解决方案是记住初始化的顺序:当@PostConstruct of 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
}
}
目前,我尝试使用 Spring Boot 和 Vaadin 创建示例实现。我试图在 spring 托管 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 没有帮助,我在这个论坛中找不到有用的答案。
几个小时后我可以自己回答这个问题。
这个问题的解决方案是记住初始化的顺序:当@PostConstruct of 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
}
}