Guice Und Scala - Injektion auf Generika Abhängigkeiten
Ich versuche zu schaffen, eine Bindung von einer generischen Eigenschaft mit Guice
Sehen, wie die trait
definiert ist
trait Repository[T]
Sehen die trait
Umsetzung
class DomainRepository extends Repository[Domain]
Mein configure Methode in DomainPersistenceModule
ist:
def configure() {
bind(classOf[Repository[Domain]])
.annotatedWith(classOf[DomainDependency])
.to(classOf[DomainRepository])
.in(Scopes.SINGLETON)
}
Die variable, deren Abhängigkeit wird gespritzt ist:
@Inject
@DomainDependency
var repository:Repository[Domain] = _
Die Injektion erfolgt hier:
val injector:Injector = Guice.createInjector(new PersistenceModule())
val persistenceService:PersistenceService =
injector.getInstance(classOf[DomainPersistenceService])
Der Fehler ist:
Caused by: com.google.inject.ConfigurationException: Guice configuration errors:
1) No implementation for repository.Repository<domain.Domain> annotated with @module.annotation.DomainDependency() was bound.
while locating repository.Repository<domain.Domain> annotated with @module.annotation.DomainDependency()
for field at service.persistence.DomainPersistenceService.repository(DomainPersistenceService.scala:19)
while locating service.persistence.DomainPersistenceService
Bin ich etwas fehlt?
Vielen Dank im Voraus
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benötigen Sie eine TypeLiteral verbindlich wie diese:
TypeLiteral
ist eine spezielle Klasse, die Sie angeben können, einen voll parametrisierten Typ. Im Grunde, Sie können nicht instanziieren einer Klasse mit einer generischen Typ-parameter.Werfen Sie auch einen Blick auf diese Antwort.
Siehe "Wie zu injizieren Klasse mit generischen Typ?" in der Guice FAQ.
Als David sagt, Sie brauchen einen
TypeLiteral
zu binden, einen generischen Typ (Sie erinnern sich - generische Typen sind gelöscht und nur die Klasse, ohne den type-parameter in run-time).Andere alternative ist so etwas wie mein Scala Guice Bibliothek zu bauen, die
TypeLiteral
s benötigt, Guice von ScalaManifest
s. Wenn Sie die Mischung in dieScalaModule
Merkmal, Sie würden dann in der Lage sein, etwas zu tun: