Java 为什么自动连线注释抛出NullPointerException?
我将JavaFX与Spring Boot相结合。 我的接口类,我正在尝试自动连接。 我已经在互联网上浏览过这个问题,但到处都是由新运营商引起的问题。 我尝试了所有的注释,但都不起作用。 最有趣的是——如果我将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
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;
}
}