@Autowired не подключает мой репозиторий — исключение нулевого указателя

#spring #spring-boot #spring-data-jpa #hibernate-mapping #autowired

Вопрос:

     @SpringBootApplication
    public class ImportCSV {
                
        @Autowired
        private static PersonRepository personRepository; //does not seem to work
        
        public static void main(String args[]) throws IOException {
            SpringApplication.run(ImportCSV.class, args);
            Person person = new Person();
            // Add a bunch of setters for person
                personRepository.save(person); //personRepository is null
        }
   }

public interface PersonRepository extends JpaRepository<Person, Long>{

}

@Data
@Entity
@Table(name = "Persons")
@NoArgsConstructor
public class Person {
    /*Declare relevant fields here*/
}
 

Пожалуйста, ознакомьтесь с приведенным выше кодом. «PersonRepository» — это ноль. Как мне это исправить? Что я делаю не так-как работает автоматическая проводка?

Ответ №1:

Пружина не впрыскивается в статические поля. Поэтому вам нужно удалить static ключевое слово из поля PersonRepository. Компилятор будет жаловаться, что вы не можете получить доступ к нестатическому полю из статического метода. Чтобы решить эту проблему, реализуйте ApplicationRunner интерфейс, который определяет run метод. В этом методе вы можете запустить весь код, который должен быть запущен после запуска приложения Spring Boot, например, для инициализации любых данных в базе данных и т. Д.
Это был бы правильный способ загрузки Spring для выполнения кода после запуска приложения.
Для еще более чистого кода вы можете создать отдельный класс, реализующий ApplicationRunner интерфейс, и переместить код туда.

Пример:

 @SpringBootApplication
public class ImportCSV implements ApplicationRunner {
            
    @Autowired
    private PersonRepository personRepository; //does not seem to work
    
    public static void main(String args[]) throws IOException {
        SpringApplication.run(ImportCSV.class, args);
    }

    @Override

    public void run(ApplicationArguments args) throws Exception {


         Person person = new Person();

         personRepository.save(person); 
    }
}