2016-07-09 23 views
1

Ich versuche, den JPAApi mit Play 2.5 in meinen Controller zu injizieren, aber ich bekomme immer die folgende Ausnahme.Play Framework Inject Error

com.google.inject.ProvisionException: Kann nicht Bereitstellung finden Sie in den folgenden Fehler:

1) Error injecting constructor, java.lang.NoClassDefFoundError: org/dom4j/io/STAXEventReader 
    at play.db.jpa.DefaultJPAApi$JPAApiProvider.<init>(DefaultJPAApi.java:39) 
    at play.db.jpa.DefaultJPAApi$JPAApiProvider.class(DefaultJPAApi.java:34) 
    while locating play.db.jpa.DefaultJPAApi$JPAApiProvider 
    while locating play.db.jpa.JPAApi 
    for parameter 0 at controllers.HomeController.<init>(HomeController.java:20) 
    while locating controllers.HomeController 
    for parameter 1 at router.Routes.<init>(Routes.scala:40) 
    while locating router.Routes 
    while locating play.api.inject.RoutesProvider 
    while locating play.api.routing.Router 
    for parameter 0 at play.api.http.JavaCompatibleHttpRequestHandler.<init>(HttpRequestHandler.scala:200) 
    while locating play.api.http.JavaCompatibleHttpRequestHandler 
    while locating play.api.http.HttpRequestHandler 
    for parameter 4 at play.api.DefaultApplication.<init>(Application.scala:221) 
    at play.api.DefaultApplication.class(Application.scala:221) 
    while locating play.api.DefaultApplication 
    while locating play.api.Application 

1 error 
    com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1025) 
    com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1051) 
    play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:405) 
    play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:400) 
    play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:123) 
    play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21) 
    play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:158) 
    play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:155) 
    play.utils.Threads$.withContextClassLoader(Threads.scala:21) 
    play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:155) 
    play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:126) 
    scala.Option.map(Option.scala:146) 
    play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:126) 
    play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:124) 
    scala.util.Success.flatMap(Try.scala:231) 
    play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:124) 
    play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:116) 
    scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) 
    scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) 
    java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402) 
    java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) 
    java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) 
    java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) 
    java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) 

Das ist mein Controller ist.

+0

1) Sie haben eine 'java.lang.NoClassDefFoundError: org/dom4j/io/STAXEventReader 'in der ersten Zeile - ist diese Abhängigkeit konfiguriert? 2) Wie sieht Ihre Guice-Konfiguration aus? – hsl

+0

Das folgende Beispiel erwähnt nichts über die Notwendigkeit, Guice zu konfigurieren, in welcher Datei würde es sich befinden? Ich habe eine Modul-Klasse, die mit Guice verwandt zu sein scheint – greyfox

+0

DOM4J wird nicht gefunden (oder eine seiner Abhängigkeiten) ... wie die Nachricht sagt. –

Antwort

7

Sie haben gerade einen Fehler in sbt (das Build-Tool, das Play verwendet). Dieser Fehler tritt bei Hibernate Version 5.2.1 (aber nicht mit 5.2.0) auf.

Hibernate 5.2.1 gestartet schließen alle transitiven Abhängigkeiten von dom4j mit einer maven Syntax aus, die kann noch nicht verarbeiten.

Die Abhilfe für jetzt ist

"dom4j" % "dom4j" % "1.6.1" intransitive() 

zu Ihrem libraryDependencies in build.sbt (parallel zur Hibernate Abhängigkeit) hinzuzufügen.

Für nähere Informationen haben einen Blick auf die sbt Fehler selbst, die hier gefunden werden kann: https://github.com/sbt/sbt/issues/1431

Die Hibernate Fehler, den ich berichtet (aber geschlossen wurde, wie es ein sbt Problem stellte sich heraus zu sein) zu finden sind hier: https://hibernate.atlassian.net/browse/HHH-10916

+0

Ja, diese Zeile hinzugefügt, alles repariert, danke! – greyfox

+0

Man du rockst! Vielen Dank. – Aphax

+0

sbt 0.13.13 den Fehler behoben, so dass diese Problemumgehung nicht mehr notwendig ist. – mkurz

0

basierend auf dem kleinen snippet, das Sie zur Verfügung gestellt haben, gehe ich davon aus, dass Sie die Play Java API verwenden. Unter der Annahme, so viel, würde ich zuerst empfehlen, verweisen Sie auf das Play documentation auf Abhängigkeitsinjektion.

, wenn Sie Ihr Projekt mit einem der Activator-Vorlagen Bootstrap haben, beendet werden Sie wahrscheinlich mit den folgenden zwei Dateien (unter vielen anderen) nach oben:

. 
├── app 
│   ├── Module.java 
└── conf 
   └── application.conf 

„Module“ sind eine Möglichkeit, Bindungen zu konfigurieren in Guice (im Grunde, was Guice zurückgibt, wenn eine Komponente die Injektion eines bestimmten Typs anfordert).

im Interesse Sie bekommen in der Zwischenzeit und läuft ...

... erste, in der application.conf Datei unter den play.modules Abschnitt, Kommentar- der Zeile in den aktivierten Satz hinzufügen von Modulen, am Ende werden Sie so etwas wie folgt aus: nächste

play.modules { 
    enabled += Module 
} 

..., vorausgesetzt, Sie eine Schnittstelle JPAApi mit einer konkreten Implementierung JPAApiImpl ... aktualisieren Sie die Module.java wie folgt benannt haben:

import com.google.inject.AbstractModule; 

public class Module extends AbstractModule { 
    @Override 
    public void configure() { 
     bind(JPAApi.class).to(JPAApiImpl.class); 
    } 
} 

(oder wenn JPAApi eine konkrete Umsetzung selbst ist, könnten Sie nur, dass binden an sich selbst)

Neustart der Anwendung und dem Controller injiziert werden soll.

+0

Spiel macht alle Guice-Konfiguration von selbst. Die JPAAPi-Bindung wird von Play ausgeführt, es muss kein Modul dafür deklariert werden. Fehler tritt nicht auf, weil Guice nicht konfiguriert ist (sollte es nicht). Ich denke, dass das Problem von der DB-Konfiguration kommt. – asch

+0

@AlaSchneider - ah-ha, danke für die Rückmeldung! also denke ich, dass die Verdrahtung der eigenen Module nur notwendig ist, um die Bindungen anzupassen? – hsl