#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);
}
}