Внедрение зависимостей Play and Guice с интерфейсом - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь использовать инъекцию зависимости Play / Guice с интерфейсом:

public interface IService {
    Result handleRequest();
}

public Service implements IService {
    @Override
    public Result handleRequest() {
        ...
        return result;
    }
}

public class Controller {
    private final IService service;

    @Inject
    public Controller(IService service) {
        this.service = service;
    }
}

Я получаю:

play.api.UnexpectedException: Unexpected exception[CreationException: Unable to create injector, see the following errors:

1.) No implementation for IService was bound.  

Если я изменю класс контроллера, чтобы не использовать интерфейсвсе работает нормально:

public class Controller {
    private final Service service;

    @Inject
    public Controller(Service service) {
        this.service = service;
    }
}

Как мне заставить его работать с интерфейсом, чтобы он нашел конкретный класс Service?

1 Ответ

0 голосов
/ 20 февраля 2019

Вы можете использовать аннотацию guice @ImplementedBy, например:

import com.google.inject.ImplementedBy;

@ImplementedBy(Service.class)
public interface IService {
    Result handleRequest();
}

. Или вы можете использовать такие модули:

import com.google.inject.AbstractModule;

public class ServiceModule extends AbstractModule {

    protected void configure() {
        bind(IService.class).to(Service.class);
    }
}

, а затем зарегистрировать их в application.conf * 1008.*

...