为什么 getBean() 在我的 JavaFX + Spring Boot 应用程序中不起作用?

时间:2021-06-08 00:59:48

标签: java spring spring-boot javafx

第一次在这里发帖。 我正在为大学制作一个 Java 项目。我将 JavaFX 用于 UI + Spring Boot 作为框架。我刚刚开始学习如何使用 Spring Boot,而且我对 JavaFX 也比较陌生。我一直在关注 intelliJ 的一系列视频来设置应用程序类:Reactive Spring Boot: Part 4: JavaFX Line Chart

一切正常,直到我尝试在 StageInitializer 类中添加依赖项注入,但我不知道为什么这会导致错误。特别是 fxmlLoader.setControllerFactory(applicationContext::getBean) 行会导致问题。如果我删除该行,它编译得很好。

@Component
public class StageInitializer implements ApplicationListener<StageReadyEvent> {
    @Value("classpath:/sample.fxml")
    private Resource resource;
    private final String applicationTitle;
    private ApplicationContext applicationContext;

public StageInitializer(@Value("${spring.application.ui.title}") String applicationTitle,
                        ApplicationContext applicationContext) {
    this.applicationTitle = applicationTitle;
    this.applicationContext = applicationContext;
}

@Override
public void onApplicationEvent(StageReadyEvent event) {
    try {
        FXMLLoader fxmlLoader = new FXMLLoader(resource.getURL());
        fxmlLoader.setControllerFactory(applicationContext::getBean); // Line that causes the issue
        Parent root = fxmlLoader.load();
        Stage stage = event.getStage();
        stage.setTitle(applicationTitle);
        stage.setScene(new Scene(root, 640, 360));
        stage.show();
    } catch (IOException e) {
        throw new RuntimeException();
    }
}
}

起初,我认为这可能是因为我在 StageInitializer、FX 类和 SpringBootApplication 类之间对应用程序进行了过多的模块化。但是,我制作了一个更简单的版本并且也出现了错误:

@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("/sample.fxml"));
    loader.setControllerFactory(applicationContext::getBean);   // Line that causes the issue
    Scene scene = new Scene(loader.load(), 640, 360, false, SceneAntialiasing.BALANCED);
    primaryStage.setScene(scene);
    primaryStage.show();
}
}

这是控制台的输出:

Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated 

in JDK 13 and will likely be removed in a future release.
Jun 07, 2021 9:57:07 PM com.sun.javafx.application.PlatformImpl startup
WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @42f2fb20'
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.0)
2021-06-07 21:57:09.045  INFO 15228 --- [JavaFX-Launcher] o.s.boot.SpringApplication               : Starting application using Java 16.0.1
2021-06-07 21:57:09.047  INFO 15228 --- [JavaFX-Launcher] o.s.boot.SpringApplication               : No active profile set, falling back to default profiles: default
2021-06-07 21:57:09.570  INFO 15228 --- [JavaFX-Launcher] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-06-07 21:57:09.587  INFO 15228 --- [JavaFX-Launcher] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 5 ms. Found 0 JPA repository interfaces.
2021-06-07 21:57:09.974  INFO 15228 --- [JavaFX-Launcher] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-06-07 21:57:10.019  INFO 15228 --- [JavaFX-Launcher] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.31.Final
2021-06-07 21:57:10.143  INFO 15228 --- [JavaFX-Launcher] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2021-06-07 21:57:10.258  INFO 15228 --- [JavaFX-Launcher] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2021-06-07 21:57:10.622  INFO 15228 --- [JavaFX-Launcher] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2021-06-07 21:57:10.638  INFO 15228 --- [JavaFX-Launcher] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect
2021-06-07 21:57:11.201  INFO 15228 --- [JavaFX-Launcher] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2021-06-07 21:57:11.214  INFO 15228 --- [JavaFX-Launcher] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2021-06-07 21:57:11.338  INFO 15228 --- [JavaFX-Launcher] o.s.boot.SpringApplication               : Started application in 3.084 seconds (JVM running for 4.332)
2021-06-07 21:57:11.340  INFO 15228 --- [JavaFX-Launcher] o.s.b.a.ApplicationAvailabilityBean      : Application availability state LivenessState changed to CORRECT
2021-06-07 21:57:11.342  INFO 15228 --- [JavaFX-Launcher] o.s.b.a.ApplicationAvailabilityBean      : Application availability state ReadinessState changed to ACCEPTING_TRAFFIC
Exception in Application start method
2021-06-07 21:57:11.386  INFO 15228 --- [lication Thread] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2021-06-07 21:57:11.388  INFO 15228 --- [lication Thread] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2021-06-07 21:57:11.391  INFO 15228 --- [lication Thread] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:831)
Caused by: java.lang.RuntimeException
    at com.ppai.reservavisita.StageInitializer.onApplicationEvent(StageInitializer.java:44)
    at com.ppai.reservavisita.StageInitializer.onApplicationEvent(StageInitializer.java:18)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)
    at com.ppai.reservavisita.ReservaVisitaFX.start(ReservaVisitaFX.java:20)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:474)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:447)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:446)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    ... 1 more

我希望我已经解释得足够好,提前致谢。

0 个答案:

没有答案