You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:00:56