Перечисление привязки GWTP в GIN

Я пытаюсь поместить перечисление в ginjector с помощью этих строк кода:

ClientGinjector.java

MyEnum getMyEnum();

ClientModule.java

bind(MyEnum.class).in(Singleton.class);

Но когда я пытаюсь скомпилировать, я получаю следующую ошибку:

[ОШИБКА] Ошибка внедрения bla.blup.MyEnum: невозможно создать или наследовать привязку: запрошена привязка для постоянного ключа «bla.blup.MyEnum», но явная привязка не найдена

Кто-нибудь может мне помочь, пожалуйста!


person Ben    schedule 19.06.2013    source источник


Ответы (2)


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

Guice/GIN рекомендует вам использовать аннотации привязки для констант, поэтому вы можете вводить разные константные значения в зависимости от контекста; например

@Named("foo") @Inject MyEnum myEnum;

–

bindConstant().annotatedWith(Names.named("foo")).to(MyEnum.FOO);

Если вы не хотите использовать аннотацию привязки (потому что вы знаете, что вам понадобится только одно значение перечисления во всем приложении), вы не можете использовать bindConstant(), но вы можете использовать toInstance:

@Inject MyEnum myEnum;

…

bind(MyEnum.class).toInstance(MyEnum.FOO);

Это будет работать только в Guice, но не в GIN, который не имеет toInstance. В GIN вы должны использовать класс Provider или метод @Provides:

class MyEnumProvider implements Provider<MyEnum> {
  @Override
  public MyEnum get() {
    return MyEnum.FOO;
  }
}
…
bind(MyEnum.class).toProvider(MyEnumProvider.class);

or

@Provides
MyEnum provideMyEnum() {
  return MyEnum.FOO;
}

Оба описанных выше подхода также будут работать с Guice.

person Thomas Broyer    schedule 19.06.2013
comment
Спасибо за ваши объяснения. Мой вариант использования будет соответствовать вашему второму варианту без аннотации. Но у меня нет метода toInstance для bind(...). Возможно, это связано с тем, что мой ClientModule является расширением AbstractPresenterModule (GWTP). - person Ben; 19.06.2013
comment
Вот блин! Плохо, toInstance нет в GIN, только в Guice. В GIN вы должны использовать метод Provider или @Provides. Ответ обновлен. - person Thomas Broyer; 19.06.2013

Константа (примитивного типа, String, Class или enum) должна быть явно привязана (используя bindConstant() или bind()) в вашем GinModule (поскольку нет разумного значения по умолчанию, которое мог бы ввести GIN).

Это то, что говорит вам GIN.

Файл — это место, где запрашивается привязка (т. е. где объявляется зависимость), которую GIN не может выполнить.

person Suresh Atta    schedule 19.06.2013
comment
Спасибо, но я уже прочитал эту запись группы Google. Я просто не понимаю, что я сделал не так. Потому что я связываю это перечисление. Смотрите мой стартовый пост. - person Ben; 19.06.2013
comment
как насчет местоположения этого Enum? - person Suresh Atta; 19.06.2013
comment
Enum находится во втором пакете проектов. Но этот пакет наследуется в Project.gwt.xml. Я использую другие классы из этого пакета без проблем. - person Ben; 19.06.2013