Spring应用程序上下文为null

我正在使用带有JavaFX的Spring Boot 1.3.3。应用程序以此成功启动启动屏幕(此时applicationContext不为null)

@SpringBootApplication

public class PirconApplication extends Application{

@Bean(name = "primaryStage")

public Stage getPrimaryStage() {

return new Stage(StageStyle.DECORATED);

}

private ConfigurableApplicationContext applicationContext = null;

private static String[] args = null;

@Override

public void stop() throws Exception {

super.stop();

Platform.exit();

applicationContext.close();

}

@Override

public void start(Stage primaryStage) throws Exception {

Task<Object> worker = worker();

worker.setOnSucceeded(new EventHandler<WorkerStateEvent>() {

@Override

public void handle(WorkerStateEvent event) {

try {

AppSplashController loader = applicationContext.getBean(AppSplashController.class);

Stage stage = applicationContext.getBean(Stage.class);

stage.setScene(loader.init());

stage.initStyle(StageStyle.UNDECORATED);

stage.show();

} catch (IOException e) {

e.printStackTrace();

System.exit(0);

}

}

});

worker.setOnFailed(new EventHandler<WorkerStateEvent>() {

@Override

public void handle(WorkerStateEvent event) {

// TODO Auto-generated method stub

System.exit(0);

}

});

worker.run();

}

public static void main(String[] args) {

PirconApplication.args = args;

launch(PirconApplication.class, args);

}

private Task<Object> worker() {

return new Task<Object>() {

@Override

protected Object call() throws Exception {

applicationContext = SpringApplication.run(PirconApplication.class, args);

return null;

}

};

}

}

问题出在AppSplashController中,applicationContext和primaryStage bean全部为null。

@Component

public class AppSplashController implements BootInitializable {

@FXML

private ImageView imgLoading;

@FXML

private Text lblWelcome;

@FXML

private Text lblRudy;

@FXML

private VBox vboxBottom;

@FXML

private Label lblClose;

private Stage primaryStage;

private ApplicationContext springContainer;

/**

* Initializes the controller class.

*/

@Override

public void initialize(URL url, ResourceBundle rb) {

System.out.println("applicationContext: "+springContainer);

System.out.println("primaryStage: "+primaryStage);

}

}

@Autowired

@Override

public void setPrimaryStage(Stage primaryStage) {

this.primaryStage = primaryStage;

}

@Override

public Scene init() throws IOException {

Parent root = FXMLLoader.load(getClass().getResource("/com/pircon/views/splash.fxml"));

return new Scene(root);

}

@Override

public void setApplicationContext(ApplicationContext ac) throws BeansException {

this.springContainer = ac;

}

}

BootInitializable接口

public interface BootInitializable extends Initializable, ApplicationContextAware {

public Scene init() throws IOException;

public void setPrimaryStage(Stage primaryStage);

}

这是我Spring和Spring靴子的第一个项目,请原谅我的无知。

回答:

我认为您需要指定spring来设置这些bean的自动装配。例如

@Autowired

private ApplicationContext springContainer;

另一个建议是使用ApplicationContextProvider,它实现了Spring ApplicationContextAware接口。

public class ApplicationContextProvider implements ApplicationContextAware {

private static ApplicationContext context;

public static ApplicationContext getApplicationContext() {

return context;

}

@Override

public void setApplicationContext(ApplicationContext ctx) {

context = ctx;

}

}

您可以通过获取应用程序上下文 ApplicationContextProvider.getApplicationContext();

以上是 Spring应用程序上下文为null 的全部内容, 来源链接: utcz.com/qa/415719.html

回到顶部