Как автоматически подключить репозиторий в приложении Swing

Я пытаюсь создать приложение Swing с помощью Spring Boot. В корне моих пакетов у меня есть основной класс:

@SpringBootApplication
public class Application
{
    public static void main(String[] args)
    {
        ConfigurableApplicationContext ctx = new SpringApplicationBuilder(Application.class)
                .headless(false)
                .run(args);

        System.out.println("Contains personRepository: " + ctx.containsBeanDefinition("personRepository"));

        EventQueue.invokeLater(() ->
        {
            ApplicationFrame appFrame = ctx.getBean(ApplicationFrame.class);
            appFrame.setVisible(true);
        });
    }
}

Насколько я понимаю, @SpringBootApplication должен найти любые компоненты Spring в пакетах под ним. Когда приложение запущено, оно запускает ApplicationFrame:

@Component
public class ApplicationFrame extends javax.swing.JFrame
{
    @Autowired PersonRepository personRepository;

    /**
    * Creates new form ApplicationFrame
    */
    public ApplicationFrame()
    {
        initComponents();
        System.out.println("personRepository = " + personRepository);
    }
}

PersonRepository находится в пакете под корнем и аннотируется @Repository.

@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {}

Когда я запускаю это, он возвращает:

Contains personRepository: true
personRepository = null

Таким образом, Application может найти репозиторий как bean-компонент, но ApplicationFrame не может его автоматически подключить. Я неправильно создаю ApplicationFrame или мне здесь чего-то не хватает?

Спасибо за любую помощь!

Хороший первый шаг - всегда заменять внедрение поля внедрением конструктора. Посмотрите, что произойдет, если вы это сделаете.

chrylis -cautiouslyoptimistic- 15.04.2018 21:15

Похоже, это помогло. Спасибо! Можете ли вы сказать мне, почему, или указать мне на ресурс, который это объясняет?

Mr. Wrong 15.04.2018 21:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
409
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, вам нужно удалить аннотацию @Repository из класса репозитория, поскольку это избыточная аннотация. Вместо этого вы должны аннотировать класс Application с помощью @EnableJpaRepositories - это более удобный способ работы с Spring Data.

О вашем выводе: вы видите personRepository = null в журнале, потому что этот оператор журнала находится внутри конструктора. На данный момент значение поля равно нулю.

В вашем случае вы используете внедрение поля - это означает, что Spring автоматически подключает bean-компоненты после создания объекта. Так что ничего плохого в классе ApplicationFrame, только с выходом.

Чтобы увидеть правильный результат, вы можете использовать инъекцию на основе конструктора:

@Component
public class ApplicationFrame extends javax.swing.JFrame
{
    private final PersonRepository personRepository;

    /**
    * Creates new form ApplicationFrame
    */
    public ApplicationFrame(final PersonRepository pr)
    {
        personRepository = pr;

        initComponents();
        System.out.println("personRepository = " + personRepository);
    }
}

Другие вопросы по теме