2016-04-07 1 views
2

Я создал простое приложение REST для книг, основанное на Spring BOOT. Я создал сопоставление/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(); 
} 

Я уверен, что есть лучший способ сделать это. Чтобы добавить эти книги, когда приложение запускается. Я слышал, что у Весны есть несколько способов инициализации, но я ничего не мог найти.

+0

пожалуйста, поделитесь своей конфигурацией базы данных –

+0

@MatiasElorriaga Для чего? У меня нет никакой конфигурации, она основана на Arraylist, и она работает нормально. Мне просто нужен метод Spring init, который будет запускаться после запуска приложения. – nowszy94

+0

Я думаю, что ваша книгаRepository поражает какой-то db, не так ли? Если это так, вы можете добавить файл sql, который будет читаться при запуске приложения. У вас нет какой-либо базы данных? –

ответ

2

Вы используете Spring Boot, что я t конец для демонстрационной заявки - добавить компонент типа CommandLineRunner. Я не люблю добавлять его в методы @PostConstruct, так как на самом деле нет гарантии, что ваши трансакции настроены, и на самом деле это часть вашего приложения, а не контроллер.

Добавьте в класс приложения следующее.

@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 для субъектов кэша.

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

И вы можете играть со статическим List, если вы хотите поделиться экземпляром

Смежные вопросы