@Autowired 没有连接我的存储库 - 空指针异常
@Autowired not wiring my repository - null pointer exception
@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' 为空。我该如何解决?我做错了什么 -- Autowire 是如何工作的?
Spring 不会注入静态字段。因此,您必须从 personRepository 字段中删除 static
关键字。然后编译器会抱怨,你不能从静态方法访问非静态字段。为了解决这个问题,实现 ApplicationRunner
接口,它定义了一个 run
方法。在该方法中,您可以 运行 所有代码,在 Spring 启动应用程序启动后应该是 运行,例如用于初始化数据库中的任何数据等
这将是应用程序启动后执行代码的正确 Spring 引导方式。
为了获得更简洁的代码,您可以创建一个单独的 class,实现 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);
}
}
@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' 为空。我该如何解决?我做错了什么 -- Autowire 是如何工作的?
Spring 不会注入静态字段。因此,您必须从 personRepository 字段中删除 static
关键字。然后编译器会抱怨,你不能从静态方法访问非静态字段。为了解决这个问题,实现 ApplicationRunner
接口,它定义了一个 run
方法。在该方法中,您可以 运行 所有代码,在 Spring 启动应用程序启动后应该是 运行,例如用于初始化数据库中的任何数据等
这将是应用程序启动后执行代码的正确 Spring 引导方式。
为了获得更简洁的代码,您可以创建一个单独的 class,实现 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);
}
}