Как использовать GWTP с расширениями ginjector?

У меня есть мобильный файл с:

<extend-configuration-property name="gin.ginjector.extensions" value="test.client.gin.ClientInjectorAdditional"/>

Мой ClientInjectorAdditional:

public interface ClientInjectorAdditional extends Ginjector {


    NotificationFetcher getNotificationFetcher();

}

Теперь я хочу внедрить NotificationFetcher в свой класс точки входа. Я старался

public class Test implements EntryPoint {

    private static final ApplicationController controller = GWT.create(ApplicationController.class);

    @Inject
    private NotificationFetcher notificationFetcher;

    @Override

    public void onModuleLoad() {
        controller.init(;
    ...

    }
}

Проблема в том, что notificationFetcher не внедряется.

Как использовать GWTP с расширениями ginjector?

Редактировать:

Когда я использую

 private final ClientInjectorAdditional injector = GWT.create(ClientInjectorAdditional.class);

Я получаю следующее предупреждение:

  No gin modules are annotated on Ginjector interface test.client.gin.ClientInjectorAdditional, did you forget the @GinModules annotation?

Редактировать:

Я старался:

@GinModules({ ClientModule.class }) открытый интерфейс ClientInjectorAdditional расширяет Ginjector { ... }

Но это дает следующую ошибку:

[DEBUG] [test] - Rebinding test.client.gin.ClientInjectorAdditional
    [DEBUG] [test] - Invoking generator com.google.gwt.inject.rebind.GinjectorGenerator
        [ERROR] [test] - Error injecting com.gwtplatform.dispatch.rest.client.ActionMetadataProvider: Unable to create or inherit binding: No @Inject or default constructor found for com.gwtplatform.dispatch.rest.client.ActionMetadataProvider
  Path to required node:

com.gwtplatform.dispatch.rest.client.RestRequestBuilderFactory [com.gwtplatform.dispatch.rest.client.gin.RestDispatchAsyncModule.configureDispatch(RestDispatchAsyncModule.java:99)]
 -> com.gwtplatform.dispatch.rest.client.DefaultRestRequestBuilderFactory [com.gwtplatform.dispatch.rest.client.gin.RestDispatchAsyncModule.configureDispatch(RestDispatchAsyncModule.java:99)]
 -> com.gwtplatform.dispatch.rest.client.ActionMetadataProvider [@Inject constructor of com.gwtplatform.dispatch.rest.client.DefaultRestRequestBuilderFactory]

        [ERROR] [test] - Error injecting com.gwtplatform.dispatch.rest.client.serialization.JacksonMapperProvider: Unable to create or inherit binding: No @Inject or default constructor found for com.gwtplatform.dispatch.rest.client.serialization.JacksonMapperProvider
  Path to required node:

com.gwtplatform.dispatch.rest.client.serialization.Serialization [com.gwtplatform.dispatch.rest.client.gin.RestDispatchAsyncModule.configureDispatch(RestDispatchAsyncModule.java:103)]
 -> com.gwtplatform.dispatch.rest.client.serialization.JsonSerialization [com.gwtplatform.dispatch.rest.client.gin.RestDispatchAsyncModule.configureDispatch(RestDispatchAsyncModule.java:103)]
 -> com.gwtplatform.dispatch.rest.client.serialization.JacksonMapperProvider [@Inject constructor of com.gwtplatform.dispatch.rest.client.serialization.JsonSerialization]

[ERROR] [test] - Deferred binding failed for 'test.client.gin.ClientInjectorAdditional'; expect subsequent failures
[ERROR] [test] - Failed to create an instance of 'test.client.test' via deferred binding 
[ERROR] [test] - Unable to load module entry point class test.client.test (see associated exception for details)
[ERROR] [test] - Failed to load module 'test' from user agent 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36' at http-server.fritz.box:61196

person confile    schedule 22.03.2014    source источник
comment
Попробуйте проанализировать исключение. Прочитай, что там написано? и следуйте инструкции, упомянутой в моем посте. Я не использовал @Inject. No default constructor found for com.gwtplatform.dispatch.rest.client.ActionMetadataProvider и No default constructor found for com.gwtplatform.dispatch.rest.client.serialization.JacksonMapperProvider   -  person Braj    schedule 22.03.2014
comment
Удалите <extend-configuration-property name="gin.ginjector.extensions"... из gwt.xml. Используйте GWT.create()   -  person Braj    schedule 22.03.2014
comment
В этом случае я должен использовать ‹extend-configuration-property name=gin.ginjector.extensions value=test.client.gin.ClientInjectorAdditional/›   -  person confile    schedule 22.03.2014
comment
Сначала попробуйте выполнить шаги, указанные в моем посте. Дайте мне знать, если это не сработает. Я не могу сказать до тех пор, пока у меня не будет полного кода. Используйте GWT.create() вместо @Inject.   -  person Braj    schedule 22.03.2014
comment
Используете ли вы gwtp с автоматически сгенерированным для вас gingector?   -  person shukshuk    schedule 25.03.2014


Ответы (3)


GWTP автоматически создает ginjector со всеми его презентаторами и получателями представлений. он также поддерживает расширение этого ginjector для объектов, отличных от GWTP. вот как вы это делаете:

а. определить интерфейс, назовем его GinjectorExtensions в пакете some.package.client

package some.package.client;

public interface GinjectorExtensions {
    //your objects here
    MyConstants getMyConstants();  
    MyMessages MyMessages();
    MyRequestFactory getRequestFactory(); 
}

б. Отредактируйте XML-файл модуля GWT, включив в него следующую строку (которая сообщает GWTP о необходимости добавить ваши строки кода в Ginjector для автоматического создания):

   <set-configuration-property name="gin.ginjector.extensions"
                              value="some.package.client.GinjectorExtensions"/> 

Затем вы просто @Inject свои объекты куда угодно, и все должно работать, как ожидалось.

РЕДАКТИРОВАТЬ: после просмотра вашего кода просто удалите «extends Ginjector» из ClientInjectorAdditional, и все должно работать.

person shukshuk    schedule 25.03.2014
comment
Как получить доступ к методам get в GinjectorExtensions? - person confile; 23.04.2014

Вот пример кода непосредственно из учебника по Gin:

Пожалуйста, выясните несоответствия:

  • gwt.xml

      <inherits name="com.google.gwt.inject.Inject"/>
    
  • MyWidgetClientModule.java

    import com.google.gwt.inject.client.AbstractGinModule;
    import com.google.inject.Singleton;
    
    public class MyWidgetClientModule extends AbstractGinModule {
        protected void configure() {
            bind(MyWidgetMainPanel.class).in(Singleton.class);
        }
    }
    
  • MyWidgetGinjector.java

    import com.google.gwt.inject.client.GinModules;
    import com.google.gwt.inject.client.Ginjector;
    
    @GinModules(MyWidgetClientModule.class)
    public interface MyWidgetGinjector extends Ginjector {
        MyWidgetMainPanel getMainPanel();
    }
    
  • MyWidgetMainPanel.java

    import com.google.gwt.user.client.ui.Button;
    
    public class MyWidgetMainPanel extends Button {
    
    }
    
  • EntryPoint.java

    private final MyWidgetGinjector injector = GWT.create(MyWidgetGinjector.class);
    
    public void onModuleLoad() {
    
        MyWidgetMainPanel mainPanel = injector.getMainPanel();
        mainPanel.setText("Hi");
        RootPanel.get().add(mainPanel);
    
    }
    
person Braj    schedule 22.03.2014

Более простое решение — внедрить Provider<NotificationFetcher> в конструктор, а затем вызывать provider.get() каждый раз, когда вы хотите создать экземпляр NotificationFetcher. Никаких дополнительных зависимостей (например, Ginjector и т. д.) определять не нужно.

person tj-recess    schedule 20.10.2014