Я использую Vaadin Spring 1.0.0 и пытаюсь выяснить, как я могу вставлять компоненты, доступные только в пределах области пользовательского интерфейса (когда пользователь открывает страницу) в классическую весну @Component
фасоль. Простой, давайте классы:Inject vaadin @UIScope bean in spring @Component
@Component
public class A {
@Inject
private IB b;
}
@UIScope
@SpringComponent
public class B implements IB {
}
И, очевидно, во время запуска:
Caused by: java.lang.IllegalStateException: No VaadinSession bound to current thread
Что такое нормальный способ, как это сделать? Я понимаю всю концепцию, что бонусы инициализируются при запуске, когда область пользовательского интерфейса недоступна, но я использую общие библиотеки, которые реализованы весной с @Component
, и я хочу реализовать некоторые из интерфейсов, но я могу сделать это только в области пользовательского интерфейса а не во время запуска.
Класс 'A' также должен быть UIScope. –
В дополнение к @ MarkRotteveel свой комментарий, то [Vaadin вики] (https://vaadin.com/wiki?p_p_id=36&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&_36_struts_action=%2Fwiki%2Fview&_36_pageResourcePrimKey=9364598&p_r_p_185834411_nodeName=vaadin.com+wiki&p_r_p_185834411_title=II+-+ Injection + и + Scopes + с + Vaadin + Spring) также объясняет причину: «... Все, что вводится с этой аннотацией, получит тот же экземпляр, что и в пределах одного и того же интерфейса. Загрузите другой пользовательский интерфейс, и вы получите другой экземпляр. Если сеанс истекает или пользовательский интерфейс закрыт, экземпляры будут очищены. ' – Morfic
@MarkRotteveel. Да, это возможно, но класс' A' является общедоступным и использует десятки других классов. Это означает, что я должен добавить '@ UIScope' для каждого зависимого класса в общей библиотеке lib. Однако этот common-lib также используется в приложениях весенней загрузки, где нет области пользовательского интерфейса или Vaadin. – Mejmo