CDI 和 JavaFX (javafx-weaver) 集成

CDI and JavaFX (javafx-weaver) Integration

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

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

可以找到源代码here

我添加了一个简单的生产者来向 CDI 上下文公开 FxWeaver

@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(){...}
}

如上代码,控制器class中的依赖服务handlingReportService在执行类似onSubmit的操作时为空(未注入),似乎在Java时FX 处理 @FXML 属性绑定它总是使用 java 反射 API.

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

有解决此问题的想法吗?

将控制器 class 标记为 @Dependent 范围以解决问题。

@Dependent
public class HandlingReportController { ...}