Служба @Autowired пуста, но мне нужно создать новый экземпляр - PullRequest
0 голосов
/ 22 февраля 2019

Я разрабатываю приложение с загрузкой Spring, я использую модель MVC.У меня есть объект с именем A, который имеет свой контроллер, сервис и хранилище.все в порядке здесь.

У меня есть служебный класс, который работает и вызывается при запуске сервера.Этот служебный класс создает набор объектов A, а затем сохраняет его в базе данных.Проблема в том, что служба autowired класса является нулевой, потому что я создал новый экземпляр класса утилиты для его запуска, поэтому Spring неправильно создает службу автоматической проводки.

, чтоis:

Main.java

@SpringBootApplication
public class MainClass {

    public static void main(String[] args) {
    ...
    Runnable task = new Utility();
    ...
}
}

Utility.java

@Autowired
private Service service;
...
public void run() {
   ...
   service.save(entities);      <-- NPE
}

Я знаю, что Spring не может подключаться автоматическислужба этого нового экземпляра, но мне нужно создать экземпляр утилиты, чтобы запустить его.

Я попытался получить доступ к службе через контекст приложения, но проблема та же:

 @Autowired 
 private ApplicationContext applicationContext;

Я попытался сделать работоспособным контроллер (если служба правильно подключена автоматически), но проблема та же, так как мне нужно сделать new controller();.

. Я прочитал эти сообщения. post 1 post 2 , но любое решение работает.

UPDATE: мне нужно, чтобы задача запускалась в новом потоке, так как она будет выполняться каждые X часов.Задача загружает набор данных из Интернета и сохраняет его в базе данных.

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Если вам нужно периодически выполнять какую-то задачу:

@SpringBootApplication
@EnableScheduling
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application .class, args);
    }
}

@Component
class Runner {

    @Autowired
    private Service service;

    @Scheduled(cron = "0 */2 * * * ?") // execute every 2 hours
    public void run() {
        // put your logic here
    }
}
0 голосов
/ 23 февраля 2019

Как сказал @CoderinoJavarino в комментариях, мне нужно использовать @Scheduled экземпляр исполняемого класса.

По расписанию Spring может автоматически подключить сервис автоматически.Итак, наконец, мой начальный исполняемый служебный класс превратился в запланированный класс.

0 голосов
/ 22 февраля 2019

Если я правильно понял, вы пытаетесь заполнить свою базу данных фиктивными данными.

Этот служебный класс создает набор объектов A, а затем сохраняет его в базе данных

Почему вы используете Runnable?Эта задача запускается через новый Thread?
Если нет, то используйте @PostConstruct внутри вашего @Controller, у которого есть доступ справа @Service.Помеченный метод гарантированно будет вызван после того, как Бин был полностью создан, и все его зависимости были удовлетворены.

@PostConstruct
private void persistEntities() {
   ...
   service.save(entities);
}

Если вы используете Spring Boot, вы можете просто поместить data-*.sql файл под src/main/resources/.Он будет запущен при запуске.

...