2014-02-13 3 views
0

현재 Vaadin의 차트 및 CDI 부가 기능을 사용하고 있으며 모의 데이터 소스를 Chart 클래스에 주입하려고합니다. 데이터 소스는 차트를 표시 할 뷰에 이미 참조가 삽입 된 싱글 톤 Bean이지만 싱글 톤이 응용 프로그램 범위 인 것처럼 중요하지 않다는 인상하에있었습니다.Vaadin 응용 프로그램에서 싱글 톤 EJB 주입 오류가 발생했습니다.

EJB가 뷰에 올바르게 주입되었지만 차트 클래스가 인스턴스화되면 데이터 소스의 주입이 실패하고 null 참조가 반환됩니다. 지금까지 인터페이스 없음 기능을 사용해 왔지만 데이터 소스에 인터페이스를 사용하더라도 아무런 차이가 없습니다. 나는 범위 지정 문제가 있거나 CDI를 근본적으로 오용/오해하고 있다고 생각합니다. 다른 방법은이 방법론이 JSF2.2에서 문제없이 작동 했으므로 Vaadin CDI 애드온에 대한 제한 사항을 실행 한 것입니다.

누구나 아이디어 나 조언이 있다면 정말 실망 스럽지만 정말 감사 할 것입니다. 이것이 빠르고 지저분한 구현이지만 프로토 타입이라고 할 수 있습니다. 우려 사항을 분리하기위한 리팩토링 (데이터 제공과 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(); 
    } 

보기 구현 (여기 성공적으로 주입) :

@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

주입이 자동으로 실패합니다. Dev 환경 : Java EE 7, 최신 CDI 및 Charts 부가 기능이있는 Vaadin 7.1.11. beans.xml 파일이 제 위치에 있고 프로듀서 메소드를 통한 레이아웃 삽입이 문제없이 작동합니다. – rustproofFish

답변

0

확인 - 문제가 무시 됨으로 보입니다. EJB 주입이 허용되는 컨텍스트를 이해하지 못했기 때문에 저의 일부분이었습니다.

EJB (MockDataProvider)는 컨테이너에 의해 인스턴스화되고 @CDIView로 주석 처리 된 DashboardView 클래스에 삽입되며 컨테이너에서도 관리됩니다. 따라서 모든 것이 잘 작동합니다. 그러나 Chart 객체는 컨테이너 관리가 아니 었습니다. @Dependent를 추가하여 컨테이너가 "통지"하도록 유도 했음에도 불구하고) - POJO 로의 주입은 허용되지 않지만 혼란에 빠지기 만하면 자동으로 실패합니다.

코드 구조는 매우 까다롭기 때문에 (닫기 커플 링, 의존도가 높고 관심사가 분리되지 않음)이 프로토 타이핑 방식으로 문제가 발생했습니다. Charts 객체를 직접 전달하거나 생성자 호출을 통해 EJB에 대한 참조를 통해 문제없이 작동합니다.

실수를 통해 잘 배우십시오. 내가 그들을 만들고있는 속도로, 나는 천재가 될거야!

+0

물론 정상적인 상황에서는 UI 구성 요소를 주입하고 싶지 않습니다 (가능한 낮은 수준의 레이아웃 제외). 이런 맥락에서 CDI를 사용하는 것은 표준 POJO에 비해 어떤 장점도없는 것처럼 보인다. – rustproofFish

관련 문제