현재 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();
주사가 자동으로 실패하거나 예외가 있습니까? 당신의 런타임은 무엇입니까? – Yuri
주입이 자동으로 실패합니다. Dev 환경 : Java EE 7, 최신 CDI 및 Charts 부가 기능이있는 Vaadin 7.1.11. beans.xml 파일이 제 위치에 있고 프로듀서 메소드를 통한 레이아웃 삽입이 문제없이 작동합니다. – rustproofFish