Spring Boot и JavaFX, используя WeaverFX - PullRequest
1 голос
/ 08 апреля 2020

Я создал программу JavaFX с F XML. Меня попросили превратить его в приложение Spring Boot. Я нашел этот сайт, чтобы помочь мне пройти через него с помощью WeaverFX. https://www.vojtechruzicka.com/javafx-spring-boot/ Я шаг за шагом следовал инструкциям и просматривал свой код, у меня все так же. Тем не менее я получаю сообщение об ошибке.

 @Override
    public void start(Stage stage) {
        FxWeaver fxWeaver = applicationContext.getBean(FxWeaver.class);
        Parent root = fxWeaver.loadView(MyController.class);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
2020-04-08 11:41:16.728  INFO 14512 --- [JavaFX-Launcher] o.s.boot.SpringApplication               : Started application in 1.239 seconds (JVM running for 2.077)
Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$1(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.myprogram.attempttwo.controller.MyController' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:351)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:342)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1126)
    at net.rgielen.fxweaver.core.FxWeaver.getBean(FxWeaver.java:295)
    at net.rgielen.fxweaver.core.FxWeaver.lambda$load$1(FxWeaver.java:381)
    at java.util.Optional.orElseGet(Optional.java:267)
    at net.rgielen.fxweaver.core.FxWeaver.load(FxWeaver.java:381)
    at net.rgielen.fxweaver.core.FxWeaver.loadView(FxWeaver.java:184)
    at net.rgielen.fxweaver.core.FxWeaver.loadView(FxWeaver.java:125)
    at net.rgielen.fxweaver.core.FxWeaver.loadView(FxWeaver.java:94)
    at com.myprogram.attempttwo.application.JavaFxApplication.start(JavaFxApplication.java:29)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294)
    at 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$3(WinApplication.java:177)
    ... 1 more

Кажется, что он не использует 'loadView', но я не знаю достаточно о Java, чтобы понять, почему это не так. Или, по крайней мере, вещи для проверки.

*** редактировать, показывая MyController.class для запроса

package com.myprogram.attempttwo.controller;

import com.myprogram.attempttwo.application.WeatherService;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import net.rgielen.fxweaver.core.FxmlView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
@FxmlView("main-stage.fxml")
public class MyController {

    @FXML
    private Label weatherLabel;
    private WeatherService weatherService;

    @Autowired
    public MyController(WeatherService weatherService) {
        this.weatherService = weatherService;
    }

    public void loadWeatherForecast(ActionEvent actionEvent) {
        this.weatherLabel.setText(weatherService.getWeatherForecast());
    }
}

1 Ответ

1 голос
/ 12 апреля 2020

Я подозреваю, что проблема в структуре вашего проекта. Я имею в виду, что ваш основной класс находится в пакете com.myprogram.attempttwo.application, а ваши классы контроллеров находятся в пакете com.myprogram.attempttwo.controller.

Пожалуйста, убедитесь, что ваш основной JavaFxApplication находится в пакете root, чтобы инициализировать все его бины. Например, вы можете переименовать ваш пакет контроллеров с помощью com.myprogram.attempttwo.application.controller, чтобы ваши контроллеры были в основном классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...