CDI 和 JavaFX (javafx-weaver) 集成

问题描述

阅读了一些关于 CDI 和 Java FX 集成的文章,以及 javafx-weaver spring integration 的源代码

我决定通过现有的 javafx-weaver 工作将 CDI 集成添加到 Java FX 以简化集成工作。

代码可以在here找到。

添加一个简单的生产者来将 Fxweaver 暴露给 CDI 上下文。

@ApplicationScoped
public class FxweaverProducer {
    private static final Logger LOGGER = Logger.getLogger(FxweaverProducer.class.getName());

    @Produces
    Fxweaver fxweaver(CDIControllerFactory callback) {
        var fxweaver = new Fxweaver((Callback<Class<?>,Object>) callback,() -> LOGGER.log(Level.INFO,"calling Fxweaver shutdown hook")
        );

        return fxweaver;
    }

    public void destroyFxweaver(@disposes Fxweaver fxweaver) {
        LOGGER.log(Level.INFO,"destroying Fxweaver bean...");
        fxweaver.shutdown();
    }
}

问题在于使用 fxweaver.loadView 加载视图时,控制器 did not work as expected

@ApplicationScoped
@FxmlView("HandlingReport.fxml")
public class HandlingReportController {
    private final static Logger LOGGER = Logger.getLogger(HandlingReportController.class.getName());

    @Inject
    private HandlingReportService handlingReportService;

    //fxml properties...

    @FXML 
    private void onSubmit(){...}
}

如上代码,控制器类中的依赖服务handlingReportService在执行onSubmit之类的操作时为null(未注入),似乎是JavaFX处理绑定它的@FXML属性时一直使用java反射API。

如果我将方法更改为 public void onSubmit()(使用 public 修饰符),按下 onSubmit 按钮时所有 FX 字段都变为空。

解决这个问题的想法吗?

解决方法

将控制器类标记为 @Dependentscope 以解决问题。

@Dependent
public class HandlingReportController { ...}