Spring整合JavaFX向PostgreSQL存数据时userRepository为空求助
问题分析与解决
你遇到的userRepository为null的问题,核心原因是JavaFX的控制器实例不是由Spring容器创建的,导致Spring的依赖注入(@Autowired)无法生效。下面是具体的修复步骤:
1. 修正RegController的注解
移除RegController上的@SpringBootApplication注解,这个注解应该放在项目的主启动类上,而非控制器类中。保留@Controller注解,让Spring识别这是一个受管理的Bean:
@Controller public class RegController { // 原有代码不变 }
2. 修复UserRepository的注解
@Repository已经足够让Spring识别这是一个数据访问层Bean,不需要额外添加@Component,移除多余的注解:
import com.raddan.Chat.Authorize.Model.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; @Repository public interface UserRepository extends JpaRepository<User, Long> { Optional<User> findById(Long id); Optional<User> findByUsername(String username); Optional<User> findByEmail(String email); }
3. 让Spring管理JavaFX控制器实例
JavaFX默认通过FXMLLoader自行创建控制器对象,这会绕过Spring的Bean管理。需要修改FXML加载逻辑,让FXMLLoader从Spring容器中获取控制器实例:
步骤3.1 创建项目主启动类
在com.raddan.Chat包下创建主启动类,负责启动Spring Boot和JavaFX:
import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class ChatApplication extends Application { private ConfigurableApplicationContext context; @Override public void init() { // 初始化Spring容器 context = SpringApplication.run(ChatApplication.class); } @Override public void start(Stage primaryStage) throws Exception { // 加载FXML时,指定控制器工厂从Spring容器获取Bean FXMLLoader loader = new FXMLLoader(getClass().getResource("/com/raddan/Chat/Authorize/View/reg.fxml")); loader.setControllerFactory(context::getBean); Parent root = loader.load(); primaryStage.setTitle("注册"); primaryStage.setScene(new Scene(root)); primaryStage.show(); } @Override public void stop() { // 关闭Spring容器 context.close(); } public static void main(String[] args) { launch(args); } }
步骤3.2 确认FXML文件的控制器配置
确保你的reg.fxml文件中,fx:controller指向RegController的全类名,且不要在FXML中手动创建控制器实例:
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.layout.AnchorPane?> <!-- 其他控件导入 --> <AnchorPane fx:id="root" xmlns:fx="http://javafx.com/fxml" fx:controller="com.raddan.Chat.Authorize.Controller.RegController"> <!-- 你的表单控件内容 --> </AnchorPane>
4. 检查必要依赖与配置
- 确保
pom.xml(或build.gradle)中包含Spring Boot Starter Data JPA、PostgreSQL驱动、Lombok和JavaFX相关依赖。 - 在
application.properties(或application.yml)中配置PostgreSQL连接信息:
spring.datasource.url=jdbc:postgresql://localhost:5432/your_database_name spring.datasource.username=your_username spring.datasource.password=your_password spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true
完成以上修改后,Spring会正确管理RegController和UserRepository的实例,@Autowired注入将正常生效,点击注册按钮时就能把用户数据保存到PostgreSQL中。
内容的提问来源于stack exchange,提问作者raddan
相关产品推荐
相关产品推荐

