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 { ...}
在阅读了一些关于 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 { ...}