我正在尝试让 Weld 在我的 JavaFX 2 (SE) 应用程序中工作(或者我应该说 JavaFX 在 Weld 中工作?)。我有响应用户交互的控制器。现在我想将我的服务(例如数据库服务)注入到这些控制器中。
使用 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 的经验,可以帮助我。
Update
我写下了我的一些努力焊接论坛 https://community.jboss.org/message/732768但不幸的是我没有得到答复。在我看来,Weld 不适用于 JavaFX。我想我必须使用好的旧设置器将我的服务插入到我的控制器中(请参阅论坛以获取解决方案)。
Update 2
我找到了一个关于 Weld 和 JavaFX 2 的博客 http://blog.matthieu.brouillard.fr/2012/08/fxml-javafx-powered-by-cdi-jboss-weld_6.html。我还没有尝试过该解决方案,但我认为它对其他程序员很有用。