2014-02-13 60 views
0

我現在正在玩Vaadin的Charts和CDI插件,並試圖將一個模擬數據源注入到Chart類中。數據源是一個singleton bean,它已經有一個引用被注入到View中,將顯示圖表,但我認爲這應該不重要,因爲singleton是應用程序範圍的。Vaadin應用程序中的單例EJB注入失敗

EJB被正確注入到視圖中,但是當圖表類被實例化時,注入數據源失敗並返回空引用。到目前爲止,我一直在使用無界面設備,但即使我使用數據源接口,這也沒有什麼區別。我猜測這是一個範圍問題,或者我從根本上誤用/誤解了CDI。另一種可能是我遇到了Vaadin CDI插件的限制,因爲這種方法在JSF2.2中沒有問題。

如果任何人有任何想法或指針,我會很感激,因爲它非常令人沮喪。當然這是一個快速和骯髒的實現,但它是一個原型;重構分離問題(數據提供與構建UI組件)可能會對問題進行排序,但我想首先理解這裏發生的情況。

EJB:

@Startup 
@Singleton 
public class MockDataProvider implements Serializable { 
    private static final long serialVersionUID = -4789949304830373309L; 
    private Random rand = new Random(); 
    private Collection<Person> people = new ArrayList<Person>(); 
    private Collection<Address> addresses = new ArrayList<Address>(); 
    private Collection<Evnt> evnts = new ArrayList<Evnt>(); 
    private Collection<TicketType> tickets = new ArrayList<TicketType>(); 


    /** 
    * Initialize the data for the application 
    */ 
    public MockDataProvider() { 
    } 

    @PostConstruct 
    private void init() { 
     loadAddressData(); 
     loadTicketData(); 
     loadEventData(); 
     loadPersonData(); 
    } 

View實現(注射成功在這裏):

@CDIView(DashboardView.VIEW_ID) 
public class DashboardView extends AbstractMVPView implements IDashboardView { 
    public final static String VIEW_ID = "dashboard"; 

    @Inject 
    @CDILogger 
    private Logger logger; 

    @EJB 
    MockDataProvider dataProvider; 

    @Inject 
    EventsPerMonthChart eventsPerMonthChart; 

    private Table eventsTable; 

    private Table peopleTable; 

    public DashboardView() { 
    } 

圖表類(由DashboardView實現 - EJB注射失敗,所以一個空指針異常被拋出dataProvider.getEvntCollection。

@Dependent 
public class EventsPerMonthChart extends Chart { 

    @EJB 
    MockDataProvider dataProvider; 

    public EventsPerMonthChart() { 
     super(ChartType.PIE); 

     setCaption("Events per month"); 
     getConfiguration().setTitle(""); 
     getConfiguration().getChart().setType(ChartType.PIE); 
     setWidth("100%"); 
     setHeight("90%"); 

     DataSeries series = new DataSeries(); 

     ArrayList<Evnt> events = (ArrayList) dataProvider.getEvntCollection(); 
+0

注射是否無效失敗或有異常?什麼是你的運行時間? – Yuri

+0

靜音注入失敗。開發環境如下:Java EE 7,帶有最新CDI和圖表插件的Vaadin 7.1.11。 beans.xml文件就位,通過生產者方法注入佈局可以毫無問題地工作。 – rustproofFish

回答

0

好的 - 它看起來像問題是無知因爲我不瞭解允許EJB注入的上下文。

EJB(MockDataProvider)由容器實例化並注入到DashboardView類中,該類由@CDIView標註,也由容器管理。因此,一切正常。然而,Chart對象並不是容器管理的(儘管我錯誤地添加了@Dependent來試圖讓容器「注意」它) - 注入到POJO中是不允許的,但是似乎默默地失敗了,這隻會增加我的困惑。當然,代碼結構非常令人震驚(緊密耦合,高度依賴並且沒有關注點的分離),並且這種劣質的原型方法一直是造成這個問題的原因。傳遞Charts直接對象數據或通過構造函數調用通過對EJB的引用工作沒有問題。

幹得好你從錯誤中學習。按照我製作它們的速度,我將成爲一名天才!

+0

當然,在正常情況下,我不想注入UI組件(可能的低級佈局除外)。在這種情況下使用CDI似乎沒有任何優於標準POJO的優勢。 – rustproofFish

相關問題