Java 为什么自动连线注释抛出NullPointerException?

Java 为什么自动连线注释抛出NullPointerException?,java,spring-boot,javafx,autowired,Java,Spring Boot,Javafx,Autowired,我将JavaFX与Spring Boot相结合。 我的接口类,我正在尝试自动连接。 我已经在互联网上浏览过这个问题,但到处都是由新运营商引起的问题。 我尝试了所有的注释,但都不起作用。 最有趣的是——如果我将ClassPathResource直接放到MyController类中,一切都会正常工作 package com.fx.springfx.repository; @Repository //@Component tried component too, same problem public

我将JavaFX与Spring Boot相结合。 我的接口类,我正在尝试自动连接。 我已经在互联网上浏览过这个问题,但到处都是由新运营商引起的问题。 我尝试了所有的注释,但都不起作用。 最有趣的是——如果我将
ClassPathResource
直接放到
MyController
类中,一切都会正常工作

package com.fx.springfx.repository;
@Repository //@Component tried component too, same problem
public interface SettingsEntityRepository extends JpaRepository<SettingsEntity, Long> {

    SettingsEntity getByCode(String code);

}
我的主课

 package com.fx.springfx;

public class JavaFXApp extends Application {

    private ConfigurableApplicationContext context;

    @Override
    public void init() {
        ApplicationContextInitializer<GenericApplicationContext> initializer =
                context -> {
                    context.registerBean(Application.class, () -> JavaFXApp.this);
                    context.registerBean(Parameters.class, this::getParameters);
                    context.registerBean(HostServices.class, this::getHostServices);
                };
        this.context = new SpringApplicationBuilder()
                .sources(SpringfxApplication.class)
                .initializers(initializer)
                .run(getParameters().getRaw().toArray(new String[0]));
    }

    @Override
    public void start(Stage stage) throws IOException {
        this.context.publishEvent(new StageReadyEvent(stage));
    }

    @Override
    public void stop() throws Exception {
        this.context.close();
        Platform.exit();
    }
}

@Component
class StageInitializer implements ApplicationListener<StageReadyEvent> {

    private final String applicationTitle;
    private final ApplicationContext applicationContext;

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

    @Override
    public void onApplicationEvent(StageReadyEvent stageReadyEvent) {
        try {
            Stage stage = stageReadyEvent.getStage();
            ClassPathResource fxml = new ClassPathResource("/fxml/admin/Login.fxml");
            //ClassPathResource fxml = new ClassPathResource("/fxml/admin/MyController.fxml");
            FXMLLoader fxmlLoader = new FXMLLoader(fxml.getURL());
            fxmlLoader.setControllerFactory(this.applicationContext::getBean);
            Parent root = fxmlLoader.load();
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.setTitle(this.applicationTitle);
            //stage.setMaximized(true);
            stage.show();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

class StageReadyEvent extends ApplicationEvent {

    private final Stage stage;

    StageReadyEvent(Stage stage) {
        super(stage);
        this.stage = stage;
    }

    public Stage getStage() {
        return stage;
    }
}


package com.fx.springfx;

@SpringBootApplication
public class SpringfxApplication {

    public static void main(String[] args) {
        //SpringApplication.run(SpringfxApplication.class, args);
        Application.launch(JavaFXApp.class, args);
    }


}

您需要在SettingsEntityRepository接口中为spring添加@Component或@Repository,以便知道它是用于自动连接的组件。

因为
@Autowired
尝试从上下文(即spring容器)注入依赖项,如果您不将类声明为bean候选类,它永远不会被扫描,也永远不会成为一个bean。所以-Spring应该注入什么?我尝试将存储库类标记为组件和存储库,同样的问题如果Spring正确管理,它不能为null。由于这是在Spring注册某些内容之前由JavaFX管理的,因此在调用init时它将为null。在我看来,您的JavaFX/Spring集成是错误的(并且看起来过于复杂)。具体来说,什么是null?什么时候抛出异常?我试图将repository类标记为Component和repository,同样的问题,设置实体呢?刚刚添加到postSpring数据中的JPA有其他加载/检测所需存储库的方法。添加任一注释都无法解决任何问题。
 package com.fx.springfx;

public class JavaFXApp extends Application {

    private ConfigurableApplicationContext context;

    @Override
    public void init() {
        ApplicationContextInitializer<GenericApplicationContext> initializer =
                context -> {
                    context.registerBean(Application.class, () -> JavaFXApp.this);
                    context.registerBean(Parameters.class, this::getParameters);
                    context.registerBean(HostServices.class, this::getHostServices);
                };
        this.context = new SpringApplicationBuilder()
                .sources(SpringfxApplication.class)
                .initializers(initializer)
                .run(getParameters().getRaw().toArray(new String[0]));
    }

    @Override
    public void start(Stage stage) throws IOException {
        this.context.publishEvent(new StageReadyEvent(stage));
    }

    @Override
    public void stop() throws Exception {
        this.context.close();
        Platform.exit();
    }
}

@Component
class StageInitializer implements ApplicationListener<StageReadyEvent> {

    private final String applicationTitle;
    private final ApplicationContext applicationContext;

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

    @Override
    public void onApplicationEvent(StageReadyEvent stageReadyEvent) {
        try {
            Stage stage = stageReadyEvent.getStage();
            ClassPathResource fxml = new ClassPathResource("/fxml/admin/Login.fxml");
            //ClassPathResource fxml = new ClassPathResource("/fxml/admin/MyController.fxml");
            FXMLLoader fxmlLoader = new FXMLLoader(fxml.getURL());
            fxmlLoader.setControllerFactory(this.applicationContext::getBean);
            Parent root = fxmlLoader.load();
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.setTitle(this.applicationTitle);
            //stage.setMaximized(true);
            stage.show();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

class StageReadyEvent extends ApplicationEvent {

    private final Stage stage;

    StageReadyEvent(Stage stage) {
        super(stage);
        this.stage = stage;
    }

    public Stage getStage() {
        return stage;
    }
}


package com.fx.springfx;

@SpringBootApplication
public class SpringfxApplication {

    public static void main(String[] args) {
        //SpringApplication.run(SpringfxApplication.class, args);
        Application.launch(JavaFXApp.class, args);
    }


}
package com.fx.springfx.entity;

@Entity
@Table(name = "Settings")
@Data
@NoArgsConstructor
public class SettingsEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @Basic
    @Column(name = "CODE")
    private String code;
    @Basic
    @Column(name = "PORT")
    private String port;
    @Basic
    @Column(name = "INTERFACE")
    private String interfaceType;
    @Basic
    @Column(name = "SIMCARD")
    private String simCard;
    @Basic
    @Column(name = "ISMODEM")
    private boolean isModem;

    public SettingsEntity(String code, String port, String interfaceType) {
        this.code = code;
        this.port = port;
        this.interfaceType = interfaceType;
    }
}