2014-02-13 31 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

相关问题