映射

时间:2017-10-24 12:13:14

标签: java spring spring-boot javafx fxml

如果没有映射fxml,这段代码运行完美并加载fxml

如果我映射fxml获取异常 我尝试了很多,但无法理解是什么问题......

SpringFxmlLoader类方法load()返回语句没有返回任何因为我认为异常发生的事情

  

javafx.fxml.LoadException:/ E:/aa/JavaFXwithSpringBoot/bin/test/spring/boot/LoginPage.fxml:15

     

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)   在javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)at   javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)at at   javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)at at   test.spring.boot.config.SpringFXMLLoader.load(SpringFXMLLoader.java:34)   在   test.spring.boot.config.StageManager.loadViewNodeHierarchy(StageManager.java:80)   在   test.spring.boot.config.StageManager.switchScene(StageManager.java:31)   在test.spring.boot.Main.displayInitialScene(Main.java:35)at   test.spring.boot.Main.start(Main.java:24)at   com.sun.javafx.application.LauncherImpl.lambda $ launchApplication1 $ 162(LauncherImpl.java:863)   在   com.sun.javafx.application.PlatformImpl.lambda $ runAndWait $ 175(PlatformImpl.java:326)   在   com.sun.javafx.application.PlatformImpl.lambda为$ null $ 173(PlatformImpl.java:295)   在java.security.AccessController.doPrivileged(Native Method)at   com.sun.javafx.application.PlatformImpl.lambda $ runLater $ 174(PlatformImpl.java:294)   在   com.sun.glass.ui.InvokeLaterDispatcher $ Future.run(InvokeLaterDispatcher.java:95)   at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)at   com.sun.glass.ui.win.WinApplication.lambda为$ null $ 148(WinApplication.java:191)   在java.lang.Thread.run(未知来源)引起:   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   属于' test.spring.boot.LoginPageController'的限定bean   可在   org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353)   在   org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)   在   org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1090)   在   javafx.fxml.FXMLLoader $ ValueElement.processAttribute(FXMLLoader.java:929)   在   javafx.fxml.FXMLLoader $ InstanceDeclarationElement.processAttribute(FXMLLoader.java:971)   在   javafx.fxml.FXMLLoader $ Element.processStartElement(FXMLLoader.java:220)   在   javafx.fxml.FXMLLoader $ ValueElement.processStartElement(FXMLLoader.java:744)   在javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)at   javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)... 16更多   应用程序启动方法中的例外2017-10-24 17:18:03.779错误   6416 --- [lication Thread] test.spring.boot.config.StageManager:   无法加载FXML视图>> /test/spring/boot/LoginPage.fxml

     

org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   属于' test.spring.boot.LoginPageController'的限定bean   可在   org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353)   〜[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE] at   org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)   〜[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE] at   org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1090)   〜[spring-context-4.3.11.RELEASE.jar:4.3.11.RELEASE] at   javafx.fxml.FXMLLoader $ ValueElement.processAttribute(FXMLLoader.java:929)   〜[jfxrt.jar:na] at   javafx.fxml.FXMLLoader $ InstanceDeclarationElement.processAttribute(FXMLLoader.java:971)   〜[jfxrt.jar:na] at   javafx.fxml.FXMLLoader $ Element.processStartElement(FXMLLoader.java:220)   〜[jfxrt.jar:na] at   javafx.fxml.FXMLLoader $ ValueElement.processStartElement(FXMLLoader.java:744)   〜[jfxrt.jar:na] at   javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)   〜[jfxrt.jar:na] at   javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)~ [jfxrt.jar:na]   在javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)   〜[jfxrt.jar:na]在javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)   〜[jfxrt.jar:na] at   test.spring.boot.config.SpringFXMLLoader.load(SpringFXMLLoader.java:34)   〜[bin /:na] at   test.spring.boot.config.StageManager.loadViewNodeHierarchy(StageManager.java:80)   [bin /:na] at   test.spring.boot.config.StageManager.switchScene(StageManager.java:31)   [bin /:na] at test.spring.boot.Main.displayInitialScene(Main.java:35)   [bin /:na]在test.spring.boot.Main.start(Main.java:24)[bin /:na] at   com.sun.javafx.application.LauncherImpl.lambda $ launchApplication1 $ 162(LauncherImpl.java:863)   [jfxrt.jar:na] at   com.sun.javafx.application.PlatformImpl.lambda $ runAndWait $ 175(PlatformImpl.java:326)   〜[jfxrt.jar:na] at   com.sun.javafx.application.PlatformImpl.lambda为$ null $ 173(PlatformImpl.java:295)   〜[jfxrt.jar:na] at java.security.AccessController.doPrivileged(Native   方法)〜[na:1.8.0_131] at   com.sun.javafx.application.PlatformImpl.lambda $ runLater $ 174(PlatformImpl.java:294)   〜[jfxrt.jar:na] at   com.sun.glass.ui.InvokeLaterDispatcher $ Future.run(InvokeLaterDispatcher.java:95)   〜[jfxrt.jar:na] at com.sun.glass.ui.win.WinApplication._runLoop(Native   方法)〜[jfxrt.jar:na] at   com.sun.glass.ui.win.WinApplication.lambda为$ null $ 148(WinApplication.java:191)   〜[jfxrt.jar:na] at java.lang.Thread.run(Unknown Source)   〜[NA:1.8.0_131]

     

2017-10-24 17:18:03.846 INFO 6416 --- [lication Thread]   s.c.a.AnnotationConfigApplicationContext:结束   org.springframework.context.annotation.AnnotationConfigApplicationContext@f096164:   启动日期[Tue Oct 24 17:18:02 IST 2017];上下文层次结构的根   2017-10-24 17:18:03.848 INFO 6416 --- [lication Thread]   o.s.j.e.a.AnnotationMBeanExporter:取消注册JMX暴露   关闭java上的bean java.lang.reflect.InvocationTargetException at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)at   sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)at   java.lang.reflect.Method.invoke(未知来源)at   com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)   在   com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)at   sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)at   java.lang.reflect.Method.invoke(未知来源)at   sun.launcher.LauncherHelper $ FXHelper.main(Unknown Source)引起:   java.lang.RuntimeException:Application start方法中的异常   com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)   在   com.sun.javafx.application.LauncherImpl.lambda $ launchApplication $ 155(LauncherImpl.java:182)   在java.lang.Thread.run(未知来源)引起:   java.lang.NullPointerException:Root不能为null   javafx.scene.Scene。(Scene.java:336)at   javafx.scene.Scene。(Scene.java:194)at   test.spring.boot.config.StageManager.prepareScene(StageManager.java:62)   在test.spring.boot.config.StageManager.show(StageManager.java:36)at   test.spring.boot.config.StageManager.switchScene(StageManager.java:32)   在test.spring.boot.Main.displayInitialScene(Main.java:35)at   test.spring.boot.Main.start(Main.java:24)at   com.sun.javafx.application.LauncherImpl.lambda $ launchApplication1 $ 162(LauncherImpl.java:863)   在   com.sun.javafx.application.PlatformImpl.lambda $ runAndWait $ 175(PlatformImpl.java:326)   在   com.sun.javafx.application.PlatformImpl.lambda为$ null $ 173(PlatformImpl.java:295)   在java.security.AccessController.doPrivileged(Native Method)at   com.sun.javafx.application.PlatformImpl.lambda $ runLater $ 174(PlatformImpl.java:294)   在   com.sun.glass.ui.InvokeLaterDispatcher $ Future.run(InvokeLaterDispatcher.java:95)   at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)at   com.sun.glass.ui.win.WinApplication.lambda为$ null $ 148(WinApplication.java:191)   ... 1个异常运行应用程序test.spring.boot.Main

Main.java

@ComponentScan("test.spring.boot")
@SpringBootApplication
public class Main extends Application {

    protected ConfigurableApplicationContext springContext;
    protected StageManager stageManager;

    @Override
    public void start(Stage primaryStage) throws IOException {
        stageManager = springContext.getBean(StageManager.class, primaryStage);
        displayInitialScene();
    }

    @Override
    public void init() throws Exception
    {
        springContext=springBootApplicationContext();
    }


    protected void displayInitialScene() {
        stageManager.switchScene(FxmlView.LOGIN);
    }


     @Override
     public void stop() throws Exception {
        springContext.close();
     }

    private ConfigurableApplicationContext springBootApplicationContext() {
        SpringApplicationBuilder builder = new SpringApplicationBuilder(Main.class);
        String[] args = getParameters().getRaw().stream().toArray(String[]::new);
        return builder.run(args);
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}

Controller.java

public class LoginPageController implements Initializable{

    @FXML
    private TextField txtUserName;

    @FXML
    private PasswordField txtPassward;

    @FXML
    private Button btnLogin;

    @FXML
    private Label lblLogin; 

    @Autowired
    private UserService userService;

    @Lazy
    @Autowired
    private StageManager stageManager;

    @FXML
    public void login()
    {
        if(userService.authenticate(txtUserName.getText(), txtPassward.getText()))
        {
            stageManager.switchScene(FxmlView.USER);
        }
        else
        {
            lblLogin.setText("Login Failed.");
        }
    }


    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }
}

FxmlView.java

public enum FxmlView {
    USER {
        @Override
        public String getTitle() {
            return getStringFromResourceBundle("user.title");
        }

        @Override
        public String getFxmlFile() {
            return "/test/spring/boot/TestSpring.fxml";
        }
    }, 


    LOGIN {
        @Override
        public String getTitle() {
            return getStringFromResourceBundle("login.title");
        }

        @Override
        public String getFxmlFile() {
            return "/test/spring/boot/LoginPage.fxml";
        }
    };

    public abstract String getTitle();
    public abstract String getFxmlFile();

    String getStringFromResourceBundle(String key){
        return ResourceBundle.getBundle("Bundle").getString(key);
    }
}

SpringFxmlLoader.java

@Component
public class SpringFXMLLoader {
    private final ResourceBundle resourceBundle;
    private final ApplicationContext context;

    @Autowired
    public SpringFXMLLoader(ApplicationContext context, ResourceBundle resourceBundle) {
        this.resourceBundle = resourceBundle;
        this.context = context;
    }

    public Parent load(String fxmlPath) throws IOException {      
        FXMLLoader loader = new FXMLLoader();
        loader.setControllerFactory(context::getBean); //Spring now FXML Controller Factory
        loader.setResources(resourceBundle);
        loader.setLocation(getClass().getResource(fxmlPath));
        System.out.println("springfxmlloader class : "+fxmlPath);
        System.out.println("LOADER : ");
        return loader.load();
    }
}

StageManager.java

public class StageManager {

 private static final Logger LOG = getLogger(StageManager.class);
    private final Stage primaryStage;
    private final SpringFXMLLoader springFXMLLoader;

    public StageManager(SpringFXMLLoader springFXMLLoader, Stage stage) {

    System.out.println(">>>>>>>>>>>>>>>>>> 1");

        this.springFXMLLoader = springFXMLLoader;
        this.primaryStage = stage;
    }

    public void switchScene(final FxmlView view) {
        System.out.println(">>>>>>>>>>>>>>>>>> 2");
        Parent viewRootNodeHierarchy = loadViewNodeHierarchy(view.getFxmlFile());
        show(viewRootNodeHierarchy, view.getTitle());
    }

    private void show(final Parent rootnode, String title) {
        Scene scene = prepareScene(rootnode);
        //scene.getStylesheets().add("/styles/Styles.css");

        //primaryStage.initStyle(StageStyle.TRANSPARENT);
        primaryStage.setTitle(title);
        primaryStage.setScene(scene);
        primaryStage.sizeToScene();
        primaryStage.centerOnScreen();

        System.out.println(">>>>>>>>>>>>>>>>>> 3");

        try {
            primaryStage.show();
        } catch (Exception exception) {
            logAndExit ("Unable to show scene for title" + title,  exception);
        }
    }

    private Scene prepareScene(Parent rootnode){

        System.out.println(">>>>>>>>>>>>>>>>>> 4");
        Scene scene = primaryStage.getScene();

        System.out.println("SCN >>>>>>>>>>>>>>>>>>>> : "+ scene);

        if (scene == null) {
            scene = new Scene(rootnode);
        }
        scene.setRoot(rootnode);
        return scene;
    }


    private Parent loadViewNodeHierarchy(String fxmlFilePath) {

        System.out.println(">>>>>>>>>>>>>>>>>> 5 path: "+fxmlFilePath);
        Parent rootNode = null;
        try {
            System.out.println(fxmlFilePath);
            rootNode = springFXMLLoader.load(fxmlFilePath);
            System.out.println(">>>>5 : try");
            Objects.requireNonNull(rootNode, "A Root FXML node must not be null");
        } catch (Exception exception) {

            System.out.println("File path????? : "+fxmlFilePath);

            logAndExit("Unable to load FXML view >> " + fxmlFilePath, exception);
            exception.printStackTrace();
        }

        return rootNode;
    }


    private void logAndExit(String errorMsg, Exception exception) {

        System.out.println(">>>>>>>>>>>>>>>>>> 6");
        LOG.error(errorMsg, exception, exception.getCause());
        Platform.exit();
    }
}

1 个答案:

答案 0 :(得分:1)

您忘记在LoginPageController课程中添加Stereotype,这就是Spring告诉您的原因:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'test.spring.boot.LoginPageController'

由于未标记类,组件扫描将忽略它,并且不会为该类型分配bean寄存器。

尝试:

@Controller
public class LoginPageController implements Initializable{

    @Autowired
    public LoginPageController(UserService userService, private StageManager stageManager){
        this.userService = userService;
        this.stageManager = stageManager;
    }
}