我现在正在玩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