我试图让 Weld 在我的 JavaFX 2 (SE) 应用程序中工作(或者我应该在 Weld 中说 JavaFX?)。我有响应用户交互的控制器。现在我想将我的服务(例如数据库服务)注入到这些控制器中。
使用 Weld 这应该很简单:
@Inject
private MyService service;
现在为了初始化 Weld,有三个选项。
选项1)
public void main(@Observes ContainerInitialized event) {
launch(); // start JavaFX
}
选项 2)
public static void main(final String[] args) {
new StartMain(args).go();
launch(args);
}
选项 3)
public static void main(final String[] args) {
final WeldContainer weld = new Weld().initialize();
service = weld.instance().select(MyService.class).get();
launch(args);
}
选项 1 和 2 在我的控制器中导致 NullPointerExceptions,因为在带注释的注入点处没有注入任何内容。只有选项 3 有效,但这并不是我真正需要的,因为我不希望该服务出现在我的主应用程序类中,而是在我的 JavaFX 控制器中。使用选项 3,我必须以某种方式将初始化的服务传递给我的控制器类,在这种情况下,我不需要 Weld。那么如何将服务 bean 注入 JavaFX 控制器呢?不幸的是,我没有找到关于我的问题的文档。
也许有人已经积累了使用 Weld 和 JavaFX 的经验,可以帮助我。
更新
我在Weld 讨论论坛上写下了我的一些努力,但不幸的是我没有得到答复。在我看来 Weld 不适用于 JavaFX。我想我必须使用好的旧设置器将我的服务插入到我的控制器中(请参阅论坛以获取解决方案)。
更新 2
我发现了一篇关于 Weld 和 JavaFX 2的博客。我还没有尝试过这个解决方案,但我认为它对其他程序员很有用。