我基于Spring BOOT为书籍创建了简单的REST应用程序。 我已经创建了一个/ books / addBasicBooks映射,添加了3本基本书籍,只是为了在我的存储库中有一些东西要测试,因为我在内存存储库中使用它在启动应用程序后是空的。
@RequestMapping(value = "/addBasicBooks")
public List<Book> addBasicBooks() {
Book book = new Book.BookBuilder("W pustyni i w puszczy", "Henryk Sienkiewicz").pages(400).build();
Book book1 = new Book.BookBuilder("Dziady IV", "Adam Mickiewicz").pages(300).build();
Book book2 = new Book.BookBuilder("Krzyzacy", "Henryk Sienkiewicz").pages(900).build();
bookRepository.save(book);
bookRepository.save(book1);
bookRepository.save(book2);
return bookRepository.listAll();
}
我敢肯定,有更好的方法可以做到这一点。要在应用程序启动时添加此书籍。我听说Spring有一些初始化方法,但我找不到任何东西。
答案 0 :(得分:3)
您可以使用前缀为@PostConstruct
的方法类似的东西:
@Controller
@RequestMapping("/hello-world")
public class HelloWorldController {
private List<Book> books;
@RequestMapping(method=RequestMethod.GET)
public List<Book> addBasicBooks() {
return books;
}
@PostConstruct
private void onInit(){
Book book = new Book.BookBuilder("W pustyni i w puszczy", "Henryk Sienkiewicz").pages(400).build();
Book book1 = new Book.BookBuilder("Dziady IV", "Adam Mickiewicz").pages(300).build();
Book book2 = new Book.BookBuilder("Krzyzacy", "Henryk Sienkiewicz").pages(900).build();
bookRepository.save(book);
bookRepository.save(book1);
bookRepository.save(book2);
books = bookRepository.listAll();
}
}
如果要共享实例
,可以使用静态列表答案 1 :(得分:2)
在实例化控制器之后,您可以使用Spring的@PostConstruct
来构建内存数据库。有关详细信息,请参阅此link。见“6.9.8”。 @PostConstruct和@PreDestroy'。
可能是这样的:
@PostConstruct
public void init(){
// initialize bookRepository
Book book = new Book.BookBuilder("W pustyni i w puszczy", "Henryk Sienkiewicz").pages(400).build();
Book book1 = new Book.BookBuilder("Dziady IV", "Adam Mickiewicz").pages(300).build();
Book book2 = new Book.BookBuilder("Krzyzacy", "Henryk Sienkiewicz").pages(900).build();
bookRepository.save(book);
bookRepository.save(book1);
bookRepository.save(book2);
}
@RequestMapping(value = "/addBasicBooks")
public List<Book> addBasicBooks() {
return bookRepository.listAll();
}
答案 2 :(得分:2)
您正在使用Spring Boot,我倾向于为演示应用程序做的是添加CommandLineRunner
类型的bean。我不想在@PostConstruct
方法中添加它,因为实际上并不保证您的transactios已设置好并且它实际上是应用程序的一部分而不是控制器。
将以下内容添加到您的应用程序类中。
@Bean
public CommandLineRunner dataInitializer(BookRepository br) {
return new CommandLineRunner() {
public void run (String... args) throws Exception {
// initialize bookRepository
Book book = new Book.BookBuilder("W pustyni i w puszczy", "Henryk Sienkiewicz").pages(400).build();
Book book1 = new Book.BookBuilder("Dziady IV", "Adam Mickiewicz").pages(300).build();
Book book2 = new Book.BookBuilder("Krzyzacy", "Henryk Sienkiewicz").pages(900).build();
bookRepository.save(book);
bookRepository.save(book1);
bookRepository.save(book2);
}
};
}
这可以使您的实际控制器和其他代码保持清洁。
@Controller
@RequestMapping("/hello-world")
public class HelloWorldController {
@RequestMapping(method=RequestMethod.GET)
public List<Book> addBasicBooks() {
return bookRepository.listAll();
}
}
我建议不要在控制器中缓存书籍,但要么使用Spring Cache抽象,要么(使用JPA时)使用ORM的提供程序二级缓存支持来缓存实体。