第一次在这里发帖。 我正在为大学制作一个 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
我希望我已经解释得足够好,提前致谢。