2017-01-27 18 views
0

Я имел этот класс следующим образом, который работает отличноКак Inject реализации в Guice 4.0

@Singleton 
public class EmpResource { 

private EmpService empService; 

@Inject 
    public EmpResource(EmpService empService) { 
     this.empService=empService; 
    } 

} 

public class EmpService { 

public void getName(){..} 

} 

Теперь вместо того, чтобы использовать EmpService непосредственно, мне пришлось создать интерфейс и EmpService реализовать этот интерфейс следующим образом.

public interface IEmpService{ 
void getName(); 
} 

public class EmpServiceImpl implements IEmpService { 
public void getName(){...} 
} 

Итак, теперь мой класс ресурсов должен использовать интерфейс, но я не уверен, как ссылаться на реализацию, которую он должен использовать.

@Singleton 
public class EmpResource { 

private IEmpService empService; 

@Inject 
    public EmpResource(IEmpService empService) { 
     this.empService=empService; 
    } 

} 

Я видел this, и я не был уверен, где мой привязки должны идти. (Это мой первый проект, связанный с Guice, поэтому я полный новичок).

Это ошибка, которая возникла «Никакой реализации для com.api.EmpService не было связано»., который совершенно понятен, но не уверен, как его исправить. Я использую вашу помощь.

FYI: Я использую приложение Dropwizard.

+3

У вас есть реализацию интерфейса 'com.google. inject.Module' где-то в вашем проекте (может быть подклассом 'com.google.inject.AbstractModule')? Это место, где можно положить свои привязки. –

+0

Да. Существует один, который расширяет модуль. Фактически я смотрел на этот пример http://www.journaldev.com/2403/google-guice-dependency-injection-example-tutorial. Поэтому в этом случае, если я поместил bind (MessageService.class) .to (MockMessageService.class); в методе configure будет ли реализация доступна? (предполагая, что dropwizard или guice сохраняет объект в приложении) – WowBow

+0

Да, это должно сработать. –

ответ

2

Вы бы настроить модуль, похожий на этот:

public class YourModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(EmpService.class).to(EmpServiceImpl.class); 
     // .... 
    } 
} 
+0

Томас, я сделал это и все еще смотрю такая же ошибка. Я слышал от коллеги, что мне нужно использовать аннотацию @Provides для другого метода в модуле. – WowBow

0

вы также должны добавить Предоставлять Methode для EmpServiceImpl класса

public class MyModule extends AbstractModule { 

    @Override 
    protected void configure() { 
      bind(IEmpService.class).to(EmpServiceImpl.class); 
    } 

    @Provides 
    EmpServiceImpl provideEmpServiceImpl() { 
     // create your Implementation here ... eg. 
     return new EmpServiceImpl(); 
    } 

}