2013-06-19 3 views
1

Я пытаюсь поставить перечисление в ginjector с этими строками кода:GWTP связывают перечисление в GIN

ClientGinjector.java

MyEnum getMyEnum(); 

ClientModule.java

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

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

[ERROR] Error injecting bla.blup.MyEnum: Unable to create or inherit binding: Binding requested for constant key 'bla.blup.MyEnum' but no explicit binding was found

Может ли кто-нибудь мне помочь?

ответ

0

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

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, который doesn't have toInstance. В GIN, вы должны использовать Provider класс или метод @Provides:

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

или

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

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

+0

Благодарим вас за разъяснения. Моя учетная запись будет соответствовать вашей второй альтернативе без аннотации. Но у меня нет метода «toInstance» на «bind (...)». Возможно, это потому, что мой «ClientModule» является расширением «AbstractPresenterModule» (GWTP). – Ben

+0

Aw snap! Мой плохой, 'toInstance' не находится в GIN, только в Guice. В GIN вы должны использовать метод 'Provider' или' @ Provides'. Ответ обновлен. –

1

A constant (primitive type, String, Class or an enum) must be explicitly bound (using bindConstant() or bind()) in your GinModule (because there's no sensible default value that GIN would inject).

That's what GIN is telling you.

В файле запрашивается привязка (то есть, где заявлена ​​зависимость), которую GIN не может выполнить.

+0

Спасибо, но я уже прочитал эту запись в группе google. Я просто не понимаю, что я сделал неправильно. Потому что я связываю это перечисление. См. Мой стартовый пост. – Ben

+0

как насчет местоположения этого Enum? –

+0

Enum находится во втором пакете проектов. Но этот пакет наследуется в Project.gwt.xml. Я использую другие классы из этого пакета без проблем. – Ben

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