Javafx 2 带Weld的引导JavaFX2.0

Javafx 2 带Weld的引导JavaFX2.0,javafx-2,weld,Javafx 2,Weld,我正在尝试使用Weld SE引导一个小型javafx应用程序。如果我删除菜单栏上的@Inject注释并手动实例化它,我就能够运行该应用程序。 但当我添加@Inject时,应用程序就会抛出异常。以下列出了注入点和生产商方法。这就是我做的所有配置,我遗漏了什么吗 注入点 @Inject MenuBar menuBar 使用生产者方法初始化 public class ComponentProducer { @Produces public MenuBar createMenuBar

我正在尝试使用Weld SE引导一个小型javafx应用程序。如果我删除
菜单栏上的
@Inject
注释并手动实例化它,我就能够运行该应用程序。 但当我添加@Inject时,应用程序就会抛出异常。以下列出了注入点和生产商方法。这就是我做的所有配置,我遗漏了什么吗

注入点

@Inject MenuBar menuBar
使用生产者方法初始化

public class ComponentProducer {

    @Produces
    public MenuBar createMenuBar(){
        return new MenuBar();
    }

}
例外情况

    491 [JavaFX Application Thread] INFO org.jboss.weld.Bootstrap - WELD-000101 Transactional services not available. Injection of @Inject UserTransaction not available.    Transactional observers will be invoked synchronously.
    8868 [JavaFX Application Thread] WARN org.jboss.interceptor.model.InterceptionTypeRegistry - Class 'javax.ejb.PostActivate' not found, interception based on it is not enabled
    8868 [JavaFX Application Thread] WARN org.jboss.interceptor.model.InterceptionTypeRegistry - Class 'javax.ejb.PrePassivate' not found, interception based on it is not enabled
    Exception in Application start method
    Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:399)
at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47)
at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115)
at java.lang.Thread.run(Thread.java:722)

    Caused by: java.lang.NullPointerException
at net.sourceforge.squirrel_sql.client.MainScene.<init>(MainScene.java:26)
at net.sourceforge.squirrel_sql.client.FXApplication.startup(FXApplication.java:176)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:304)
at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54)
at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:163)
at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:298)
at org.jboss.weld.introspector.jlr.WeldMethodImpl.invokeOnInstance(WeldMethodImpl.java:200)
at org.jboss.weld.introspector.ForwardingWeldMethod.invokeOnInstance(ForwardingWeldMethod.java:59)
at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:194)
at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:241)
at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:216)
at org.jboss.weld.manager.BeanManagerImpl.notifyObservers(BeanManagerImpl.java:654)
at org.jboss.weld.manager.BeanManagerImpl.fireEvent(BeanManagerImpl.java:647)
at org.jboss.weld.manager.BeanManagerImpl.fireEvent(BeanManagerImpl.java:641)
at org.jboss.weld.event.EventImpl.fire(EventImpl.java:93)
at net.sourceforge.squirrel_sql.client.Main.start(Main.java:180)
at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:315)
at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:174)
at com.sun.javafx.application.PlatformImpl$3.run(PlatformImpl.java:141)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication$2$1.run(GtkApplication.java:79)
... 1 more
491[JavaFX应用程序线程]INFO org.jboss.weld.Bootstrap-weld-000101事务服务不可用。@InjectUserTransaction的注入不可用。事务性观察程序将被同步调用。
8868[JavaFX应用程序线程]WARN org.jboss.interceptor.model.InterceptionTypeRegistry-找不到类“javax.ejb.PostActivate”,基于它的拦截未启用
8868[JavaFX应用程序线程]WARN org.jboss.interceptor.model.InterceptionTypeRegistry-未找到类“javax.ejb.PrePassivate”,未启用基于它的拦截
应用程序启动方法中的异常
线程“main”java.lang.RuntimeException中的异常:应用程序启动方法中的异常
位于com.sun.javafx.application.LaunchImpl.launchApplication1(LaunchImpl.java:399)
访问com.sun.javafx.application.launchempl.access$000(launchempl.java:47)
位于com.sun.javafx.application.launchempl$1.run(launchempl.java:115)
运行(Thread.java:722)
原因:java.lang.NullPointerException
位于net.sourceforge.squirrel_sql.client.mainsecene.(mainsecene.java:26)
位于net.sourceforge.squirrel\u sql.client.FXApplication.startup(FXApplication.java:176)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:601)
位于org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:304)
位于org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54)
位于org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:163)
位于org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:298)
在org.jboss.weld.introspector.jlr.WeldMethodImpl.InvokeInstance(WeldMethodImpl.java:200)上
位于org.jboss.weld.introspector.ForwardingWeldMethod.invokeOnInstance(ForwardingWeldMethod.java:59)
位于org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:194)
位于org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:241)
位于org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:216)
位于org.jboss.weld.manager.BeanManagerImpl.notifyObservers(BeanManagerImpl.java:654)
位于org.jboss.weld.manager.BeanManagerImpl.firevent(BeanManagerImpl.java:647)
位于org.jboss.weld.manager.BeanManagerImpl.firevent(BeanManagerImpl.java:641)
位于org.jboss.weld.event.EventImpl.fire(EventImpl.java:93)
位于net.sourceforge.squirrel_sql.client.Main.start(Main.java:180)
位于com.sun.javafx.application.launchempl$5.run(launchempl.java:315)
位于com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:174)
位于com.sun.javafx.application.PlatformImpl$3.run(PlatformImpl.java:141)
在com.sun.glass.ui.gtk.GtkApplication.\u runLoop(本机方法)
位于com.sun.glass.ui.gtk.GtkApplication$2$1.run(GtkApplication.java:79)
... 还有一个

是因为您试图在构造函数或初始化器块中使用菜单栏吗


如果是这样,请尝试使用Initializable并在initialize中使用它们。

EJB文档说明在注入完成后将调用用@PostConstruct注释的方法,并且这是期望变量注入的方法

构造后注释用于需要在依赖项注入完成后执行的方法,以执行任何初始化。

但是,期望变量在
initialize
中初始化似乎是可行的

根据可初始化文档,调用initialize以在根元素完全处理后初始化控制器。

初始化和@PostConstruct调用顺序

我认为可以安全地理解,调用initialize与对象构造没有任何关系。相反,当当前节点图的根被完全处理时,会调用initialize,因此可以处理事件处理程序等
document.onload
jQuery(document.ready()
行中的内容。如果在对象图准备就绪之前尝试附加事件处理程序,则很可能会看到空指针,因为节点不是对象图,因此无法附加事件处理程序

因此,在将对象加载到场景图之前,需要实例化对象(直接或通过注入)。因此,在初始化之前会调用@PostConstruct。但是,如果您直接实例化对象,那么调用带注释的@PostConstruct方法的责任就落在您身上,否则就不会进行后期处理

结论: 可以安全地假设initialize总是在用@PostConstruct注释的方法之后调用

编辑

@Jewelsea已经指出了我上面没有列出的一些假设。这就是我所经历的情况

  • 将FXML文件用于视图
  • 在fxml文件中指定的控制器名称
ShaggyInjun,您所指的界面表明您正试图与集成。下面的所有信息都假设您正在使用FXML进行接口定义,并且只讨论与i有关的问题
public class FXMLLoaderProducer {
  @Inject Instance<Object> instance;
  @Produces public FXMLLoader createLoader() {
    FXMLLoader loader = new FXMLLoader();
    loader.setControllerFactory(new Callback<Class<?>, Object>() {
      @Override public Object call(Class<?> param) {
        return instance.select(param).get();
      }
    });
    return loader;
  }
}
class GuiceControllerFactory implements Callback<Class<?>, Object> {
  private final Injector injector;
  public GuiceControllerFactory(Injector anInjector) {
    injector = anInjector;
  }     
  @Override public Object call(Class<?> aClass) {
    return injector.getInstance(aClass);
  }
}