2016-03-07 5 views
3

У меня есть раздражающая проблема с ошибкой Playframwork GlobalSettings вопрос, я хочу переместить мою конду внутри onStart в предложенный вами способ, но на самом деле я не могу это сделать, документация не имеет смысла, и у меня есть не знаю, как это решить, я провел дни и дни, пытаясь сделать это без везения!java Playframework Отмена устаревания GlobalSettings для onStart

https://www.playframework.com/documentation/2.5.x/GlobalSettings

Просто я хочу, чтобы запустить базу данных исходным методом

private void initialDB() { 
     UserService userService = play.Play.application().injector().instanceOf(UserService.class); 
     if (userService.findUserByEmail("[email protected]") == null) { 
      String email = "[email protected]"; 
      String password = "1234"; 
      String fullName = "My Name"; 
      User user = new User(); 
      user.password = BCrypt.hashpw(password, BCrypt.gensalt()); 
      user.full_name = fullName; 
      user.email = email; 
      user.save(); 
     } 
} 

Это был внутри onStart метод в Global extends GlobalSettings Java файл, я попытался извлечь его внешний модуль, но не повезло.

public class GlobalModule extends AbstractModule { 

    protected void configure() { 
     initialDB(); 
    } 
} 

Я нашел несколько решений в Scala и не знаю, как это может быть в Java, но у меня нет времени, чтобы узнать это, кроме того, что мне не нравится это тоже.

ответ

11

Вам нужны два класса - один для обработки инициализации и модуль для регистрации привязки.

Код инициализации:

@Singleton 
public class OnStartup { 

    @Inject 
    public OnStartup(final UserService userService) { 
     if (userService.findUserByEmail("[email protected]") == null) { 
      String email = "[email protected]"; 
      String password = "1234"; 
      String fullName = "My Name"; 
      User user = new User(); 
      user.password = BCrypt.hashpw(password, BCrypt.gensalt()); 
      user.full_name = fullName; 
      user.email = email; 
      user.save(); 
     } 
    } 
} 

Модуль:

public class OnStartupModule extends AbstractModule { 
    @Override 
    public void configure() { 
     bind(OnStartup.class).asEagerSingleton(); 
    } 
} 

Наконец, добавьте модуль application.conf.

play.modules.enabled += "com.example.modules.OnStartupModule" 

Оставив синглтон нетерпением, он будет запущен при запуске приложения.

+0

Да, я пробовал что-то вроде этого, я достигаю 'OnStartup', но потом я получаю' конструктор инъецирования ошибок, java.lang.RuntimeException: нет запущенного приложения' –

+0

О, кажется, потому что я имею доступ к 'Play.application () .configuration() 'для получения конфигураций. –

+1

Большое спасибо, я, наконец, решил свою проблему :) проблема была сложной, я пытался получить доступ к экземплярам, ​​которые не должны вызываться до запуска приложения, я добавил параметр в конструктор 'public OnStartup (окончательный UserService userService, окончательная конфигурация конфигурации) 'и получить доступ к' config' like 'configuration.getString (" initialName ")' –

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