问题描述
阅读了一些关于 CDI 和 Java FX 集成的文章,以及 javafx-weaver spring integration 的源代码。
我决定通过现有的 javafx-weaver 工作将 CDI 集成添加到 Java FX 以简化集成工作。
我添加了一个简单的生产者来将 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 字段都变为空。
有解决这个问题的想法吗?
解决方法
将控制器类标记为 @Dependent
scope 以解决问题。
@Dependent
public class HandlingReportController { ...}