在JavaFX+Spring Boot的Java中,边界类如何与控制器类连接



我正在为一个大学项目制作一个SpringBoot+JavaFX应用程序。由于我们正在研究统一过程中的BCE(边界/控制/实体(模式,因此我们必须实现一个考虑到这一点的用例。我正在用Java编写用例,使用JavaFX作为UI,使用Spring Boot作为框架。在JavaFX fxml文件中,当您定义控制器类属性时,我认为它应该是边界类,而不是控制器本身,因为应用程序的第一个方法指向边界对象。问题是,后来我不知道如何将边界类链接到Spring上下文中的控制器,因为如果我在边界类中定义controller控制器属性,程序将无法编译。这是我的Spring/JavaFX应用程序类:

@SpringBootApplication
public class SpringApp extends Application {
public static ConfigurableApplicationContext applicationContext;
public static Parent root;
public static Stage stage;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
applicationContext = SpringApplication.run(SpringApp.class);
FXMLLoader loader = new FXMLLoader(SpringApp.class.getResource("/app.fxml"));
loader.setControllerFactory(applicationContext::getBean);
Scene scene = new Scene(loader.load(), 640, 360, false, SceneAntialiasing.BALANCED);
primaryStage.setScene(scene);
primaryStage.show();
}
}

这是边界类的一部分(定义为fxml文件中的控制器(:

public class SaveNewClientBoundary implements Initializable {
@FXML
public ComboBox<Client> cboClients;
@Autowired
private ClientRepo clientRepo;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
saveNewClientOption();
}
public void saveNewClientOption(){
showClients();
}
public void showClients() {
cboClients.setItems(FXCollections.observableArrayList(clientRepo.findAll()));
}

现在,这一切都起作用了,但它没有正确使用模式(因为findAll()方法(。我想做的是将与实体对象的通信委托给控制器,所以控制器看起来像这样:

@Component
public class SaveNewClientController {
private List<Client> clients;
@Autowired
private ClientRepo clientRepo;

public void saveNewClientOption() {
this.searchAllClients();
}
public void searchAllClients() {
this.clients = clientRepo.findAll();
}
public List<Client> getClients() {
return clients;
}

然而,如果我这样做,我就不知道如何让边界对象访问控制器所查找的客户端。基本上,我不知道如何在程序启动后实例化控制器并将其链接到Boundary类(并将边界类链接到控制器(。

我最终通过在边界类和控制器之间实现循环依赖来修复它:Setter/Field-Injection

在此之前,我试图在Boundary类initialize()方法中创建控制器的实例,但它抛出了一个controller NullPointer异常,因为Spring Boot不是这样工作的。感谢其他回复。

最新更新