我現在正在玩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();
注射是否無效失敗或有異常?什麼是你的運行時間? – Yuri
靜音注入失敗。開發環境如下:Java EE 7,帶有最新CDI和圖表插件的Vaadin 7.1.11。 beans.xml文件就位,通過生產者方法注入佈局可以毫無問題地工作。 – rustproofFish