2015-10-14 3 views
2

Я использую 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, и я хочу реализовать некоторые из интерфейсов, но я могу сделать это только в области пользовательского интерфейса а не во время запуска.

+1

Класс 'A' также должен быть UIScope. –

+0

В дополнение к @ 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

+0

@MarkRotteveel. Да, это возможно, но класс' A' является общедоступным и использует десятки других классов. Это означает, что я должен добавить '@ UIScope' для каждого зависимого класса в общей библиотеке lib. Однако этот common-lib также используется в приложениях весенней загрузки, где нет области пользовательского интерфейса или Vaadin. – Mejmo

ответ

0

Вы должны получить его от самого ApplicationContext:

@Component 
public class A { 

     @Autowired 
     private ApplicationContext context; 

     public B getCurrentB(){ 
      return context.getBean(B.class); 
     } 
} 

Обратите внимание, что он будет бросать исключение, если нет пользовательского интерфейса, связанный с текущим потоком (обычно). Другими словами, вы ДОЛЖНЫ убедиться, что этот метод вызван только во время запроса пользовательского интерфейса. Любой слушатель в Ваадине должен быть в порядке, если вы в том же потоке с запросом.

0

Попробуйте вместо этого ввести прокси-сервер с расширенным диапазоном.

Например:

@Scope(value="vaadin-ui", proxyMode=ScopedProxyMode.INTERFACES) 
@SpringComponent 
public class B implements IB { 
} 

Я думаю, что должно работать.