Google guice не работает без использования, реализованного

У меня интерфейс как

public interface ConfFileLoader {

    public Map<String, Object> getResultMap() throws SecurityException, IOException;
}

и класс, который реализует его как

public class ConfYamlLoader implements ConfFileLoader{

    @Override
    public Map<String, Object> getResultMap() throws SecurityException, IOException {

    }

}

и имеет класс инжектора как

public class AppInjector extends AbstractModule {
    @Override
    public void configure() {
        bind(ConfFileLoader.class).to(ConfYamlLoader.class);
    }
}

Теперь проблема в том, что у меня есть класс как

public class TI {


    @Inject
    private ConfFileLoader confFileLoader;


    public void test(){
        System.out.println("yeah tesrintY>>>>>>>>>>>>>>>>>>>"+confFileLoader);
    }

}

и это дает исключение, поскольку

Exception in thread "main" com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for com.exzeo.conf.ConfFileLoader was bound.
  while locating com.exzeo.conf.ConfFileLoader
    for field at com.exzeo.automate.HCPCI.TI.confFileLoader(TI.java:10)
  while locating com.exzeo.automate.HCPCI.TI

но когда я использую @ConfYamlLoader, он отлично работает как

public class TI {


    @Inject
    private ConfYamlLoader confFileLoader;


    public void test(){
        System.out.println("yeah tesrintY>>>>>>>>>>>>>>>>>>>"+confFileLoader);
    }

}

Этот класс выше работает нормально

Итак, в ходе расследования я обнаружил, что когда я добавляю @implemetedby в ConfFileLoader, он отлично работает как

@ImplementedBy(ConfYamlLoader.class)
public interface ConfFileLoader {

    public Map<String, Object> getResultMap() throws SecurityException, IOException;
}

Я не могу понять этого поведения, поэтому мне нужно делать @ImplementedBy, если я уже привязываю его в модуле привязки. Насколько я понимаю, @implementedby является равносильным для bind ().

Сообщите мне, если я что-то упустил и использую guice версии 3


person Dhruv Pal    schedule 20.03.2015    source источник
comment
Единственная причина, по которой это может произойти, заключается в том, что вы вообще не используете свой модуль. Еще раз проверьте, действительно ли вы передаете экземпляр AppInjector в Guice.createInjector().   -  person Vladimir Matveev    schedule 20.03.2015
comment
Инжектор-инжектор = Guice.createInjector (новый AppInjector ()); Я делаю это @VladimirMatveev   -  person Dhruv Pal    schedule 20.03.2015
comment
Извините, но мне не удалось воспроизвести вашу проблему. См. эту суть. Он содержит именно тот код, который вы предоставили, и небольшой кусок связующего кода в Main. У меня он отлично работает, печатаю guicex.ConfYamlLoader@5dbc26ee при вызове test() метода.   -  person Vladimir Matveev    schedule 20.03.2015
comment
@VladimirMatveev Извините, я не упомянул кое-что важное. Я использую testng, чтобы запустить тестовый класс, и в этот класс я ввожу ConFileLoader. Я использую TestNG как TestNG tng = new TestNG (); tng.setXmlSuites (xmlSuiteBuilder.getSuites ()); tng.run (); xml Suite Builder предоставит подробную информацию о тестовом классе   -  person Dhruv Pal    schedule 22.03.2015


Ответы (1)


Ваша линия

bind(ConfFileLoader.class).to(ConfYamlLoader.class);

означает «всякий раз, когда вы собираетесь ввести значение типа ConfFileLoader, вместо этого введите значение типа ConfYamlLoader и используйте его».

Но еще нужно как-то привязать ConfYamlLoader, чтобы его можно было закачать.

Если у него есть конструктор с аннотациями @Inject или общедоступный конструктор без аргументов (если вы где-то не вызывали binder.requireAtInjectOnConstructors()), то Guice будет использовать его.

В противном случае вам нужно будет каким-то образом связать Provider<ConfYamlLoader>, используя метод @Provides ConfYamlLoader или bind(ConfYamlLoader).toProvider(...) или .toInstance(...).

person Daniel Pryden    schedule 27.03.2015