Настольное приложение Google Guice - как заставить его работать? - PullRequest
4 голосов
/ 16 января 2012

Я без проблем использовал Guice в своем веб-приложении и хотел использовать его в настольном приложении. Я, конечно, упускаю одну вещь - какой-то способ рассказать моему приложению, как связать все и знать, что к чему. В веб-приложении у меня была декларация для этого в классе приложения, как мне сделать это в моем настольном приложении?

Вот соответствующий код, который я использую:

public class GuiceModule extends AbstractModule
{
   @Override
   protected void configure()
   {
   // Enable per-request-thread PersistenceManager injection.
   install(new PersistenceManagerFilter.GuiceModule());
   // Business object bindings go here.
   bind(ProjectQueries.class).to(JdoProjectQueries.class);
   bind(new TypeLiteral<Repository<Project>>() { }).to(JdoProjectRepository.class);
 }

Мой основной класс:

@Inject
public Repository<Project> projectRepo;

public void createNewProject() {
   ...
   projectRepo.persist(newProject);
}

Я, конечно, попадаю на projectRepo.persist (newProject);

Итак, что еще мне нужно сделать, чтобы это заработало?

EDIT:

Хорошо, эта часть теперь работает, спасибо :) Кажется, мне нужно сделать немного больше, чтобы упорство работало таким образом.

Я сейчас получаю NPE:

public void persist(T entity) 
{ 
pmProvider.get().makePersistent(entity); 
} 

get () возвращает здесь ноль

похоже установить (новый PersistenceManagerFilter.GuiceModule ()); недостаточно. Что мне нужно сделать? Мой класс репозитория начинается с:

public abstract class JdoRepository<T> implements Repository<T> { 
  private final Class<T> clazz; 
  private final Provider<PersistenceManager> pmProvider; 
  protected JdoRepository(Class<T> clazz, Provider<PersistenceManager> pmProvider)    {       this.clazz = clazz; this.pmProvider = pmProvider; 
} 

В моем PMF у меня есть:

public static class GuiceModule extends AbstractModule { 

  @Override protected void configure() { 
    bind(PersistenceManager.class).toProvider(new Provider<PersistenceManager>() {
      public PersistenceManager get() { 
         return PersistenceManagerFilter.pm.get(); 
         } 
      }); 
    } 
   }

Ответы [ 3 ]

5 голосов
/ 16 января 2012

Создать Bootstrap класс с методом main.

Переместите текущий код статического метода main на нестатический. Например Application#run.

Создать основной метод в Bootstrap классе:

public static void main(String[] args) {
    Injector injector = Guice.createInjector(new GuiceModule())
    Application app = injector.getInstance(Application.class);
    app.run();
}

Выполнить Bootstrap класс.

3 голосов
/ 16 января 2012

Любой объект, созданный с помощью инжектора Guice, будет вводить объекты в свои свойства и методы. Так что одним из способов будет создание инжектора в createNewProject.

Injector injector = Guice.createInjector(new BeanModule(),.....
YourMainClass startClass = injector.getInstance(YourMainClass.class);
startClass.kickOfEveryThing();....
1 голос
/ 16 января 2012

Вам нужно как минимум задать один корневой объект для инжектора.Этот корневой объект будет добавлен с объектами, которые будут добавлены с объектами и т. Д. Процесс должен загрузиться.

См. http://code.google.com/p/google-guice/wiki/GettingStarted

Injector injector = Guice.createInjector(new GuiceModule());
Main main = injector.getInstance(Main.class);
...