2015-10-14 85 views
2

我正在使用Vaadin Spring 1.0.0並試圖找出如何將僅在UI範圍內(當用戶打開頁面時)可用的bean注入經典彈簧@Component豆。很簡單,讓我們班:Spring @Component中注入vaadin @UIScope bean @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 

什麼是正常的方式該怎麼辦呢?我理解了整個概念,即在UI範圍不可用時啓動時初始化Bean,但我使用在Spring中用@Component實現的公共庫,並且我想實現一些接口,但我只能在UI範圍內實現而不是在啓動過程中。

+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+-+注入+和+範圍+ + Vaadin + Spring)也解釋了原因:'...注入了該註釋的任何東西在相同的UI內都會得到相同的實例。加載一個不同的用戶界面,你會得到一個不同的實例。如果會話過期或UI關閉,實例將被清除.' – Morfic

+0

@MarkRotteveel是的,這是可能的,但''A類來自common-lib並且使用了數十個其他類。這意味着我必須將'@ UIScope'添加到常見lib中的每個相關類。然而,這個common-lib也用於沒有UI範圍或Vaadin的彈簧啓動應用程序。 – Mejmo

回答

0

你需要從自身ApplicationContext得到它:

@Component 
public class A { 

     @Autowired 
     private ApplicationContext context; 

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

注意,它會拋出異常,如果沒有綁定到當前線程(正常)的用戶界面。換句話說,你必須確保這個方法只在UI請求期間被調用。只要您與請求處於相同的線程中,Vaadin中的任何類型的監聽者都可以。

0

嘗試注入aop作用域代理。

例如:

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

我認爲應該工作。

相關問題