2017-04-03 1 views
0

J'ai un peu de problème lorsque j'obtiens un NoSuchMethodError lors de l'exécution de mon application en raison d'un échec de l'initialisation de la ressource WebJarAssets. Je souhaite utiliser WebJarAssets comme suit dans mes fichiers scala.htmlNoSuchMethodError lors de l'injection de contrôleurs WebJarAssets

<script type='text/javascript' src='@routes.WebJarAssets.at(WebJarAssets.fullPath("react", "react.js"))'></script> 
<script type='text/javascript' src='@routes.WebJarAssets.at(WebJarAssets.fullPath("react", "react-dom.js"))'></script> 
<script type='text/javascript' src='@routes.WebJarAssets.at(WebJarAssets.fullPath("jquery", "jquery.js"))'></script> 

Mon build.sbt est la suivante

name := "myApp" 
version := "1.0" 

lazy val root = (project in file(".")).enablePlugins(PlayJava, SbtWeb, PlayEbean) 

scalaVersion := "2.11.8" 

JsEngineKeys.engineType := JsEngineKeys.EngineType.Node 

libraryDependencies ++= Seq(
    javaJdbc, 
    cache, 
    javaWs, 
    "mysql" % "mysql-connector-java" % "5.1.27", 
    "commons-io" % "commons-io" % "2.5" withSources(), 
    "org.webjars" % "webjars-play_2.11" % "2.4.0-2", 
    //"org.webjars" %% "webjars-play" % "2.5.0", 
    "org.webjars" % "react" % "15.3.1", 
    "org.webjars.npm" % "react-dom" % "15.0.1", 
    "org.apache.poi" % "poi" % "3.14", 
    "org.apache.poi" % "poi-ooxml" % "3.14", 
    "org.webjars" % "jquery" % "3.1.0", 
    "org.apache.pdfbox" % "pdfbox" % "2.0.3", 
    "org.webjars" % "highcharts" % "4.2.5", 
    "org.webjars" % "material-design-icons" % "3.0.0", 
    evolutions, 
    "javax.mail" % "mail" % "1.4.7", 
    "be.objectify" %% "deadbolt-java" % "2.5.3" 
) 

resolvers += Resolver.url("Typesafe Ivy releases", url("https://repo.typesafe.com/typesafe/ivy-releases"))(Resolver.ivyStylePatterns) 

fork in run := false 

Comme vous pouvez le voir, je l'ai essayé deux différentes bibliothèques webjar le plugin.sbt pour mon application est la suivante

// The Play plugin 
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.12") 

// Web plugins 
addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0") 
addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.0") 
addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.4") 
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.8") 
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.1") 
addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0") 
addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.6") 
addSbtPlugin("io.teamscala.sbt" % "sbt-babel" % "1.0.5") 

addSbtPlugin("com.typesafe.sbt" % "sbt-gzip" % "1.0.0") 
//addSbtPlugin("com.github.stonexx.sbt" % "sbt-babeljs" % "1.0.5") 

// Play enhancer - this automatically generates getters/setters for public fields 
// and rewrites accessors of these fields to use the getters/setters. Remove this 
// plugin if you prefer not to have this feature, or disable on a per project 
// basis using disablePlugins(PlayEnhancer) in your build.sbt 
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0") 

// Play Ebean support, to enable, uncomment this line, and enable in your build.sbt using 
// enablePlugins(PlayEbean). 
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "4.0.0-M2") 

//sbt plugin for eclipse 
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "5.1.0") 

Lors de l'application en cours d'exécution, je reçois la trace de pile suivante

1) Error injecting constructor, java.lang.NoSuchMethodError: controllers.AssetsBuilder.<init>(Lplay/api/http/HttpErrorHandler;)V 
    at controllers.WebJarAssets.<init>(WebJarAssets.scala:20) 
    at controllers.WebJarAssets.class(WebJarAssets.scala:20) 
    while locating controllers.WebJarAssets 
    for the 10th parameter of router.Routes.<init>(Routes.scala:61) 
    while locating router.Routes 
    while locating play.api.inject.RoutesProvider 
    while locating play.api.routing.Router 
    for the 1st parameter of play.api.http.JavaCompatibleHttpRequestHandler.<init>(HttpRequestHandler.scala:205) 
    while locating play.api.http.JavaCompatibleHttpRequestHandler 
    while locating play.api.http.HttpRequestHandler 
    for the 6th parameter of play.api.DefaultApplication.<init>(Application.scala:228) 
    at play.api.DefaultApplication.class(Application.scala:227) 
    while locating play.api.DefaultApplication 
    while locating play.api.Application 

1 error 
    at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1028) 
    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1054) 
    at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:405) 
    at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:400) 
    at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:137) 
    at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21) 
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:166) 
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:163) 
    at play.utils.Threads$.withContextClassLoader(Threads.scala:21) 
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:163) 
Caused by: java.lang.NoSuchMethodError: controllers.AssetsBuilder.<init>(Lplay/api/http/HttpErrorHandler;)V 
    at controllers.WebJarAssets.<init>(WebJarAssets.scala:20) 
    at controllers.WebJarAssets$$FastClassByGuice$$db4380e1.newInstance(<generated>) 
    at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:89) 
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:111) 
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:90) 
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:268) 
    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) 
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092) 
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) 
    at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:194) 

Toute idée de ce qui pourrait être à l'origine de ce problème serait vraiment utile.

+0

pas lié à votre problème, mais la version actuelle de PDFBox est 2.0. 5 –

Répondre

1

Vous utilisez Jouez 2.5 afin d'utiliser la dépendance suivante:

"org.webjars" %% "webjars-play" % "2.5.0-4" 

Et assurez-vous que vous avez défini un itinéraire:

GET   /assets/*file   controllers.Assets.at(path="/public", file) 
+0

Merci d'avoir essayé cela sans succès. En allant de cette façon, est-ce que je devrais injecter une instance de contollers.WebJarAssets et la passer en paramètre lors du rendu des fichiers de vue? Je demande à ce que ce ne soit pas paresseux de lire la documentation (j'ai tourné mes roues sur ça pendant une semaine) mais parce qu'il y a une échéance qui approche à grands pas et je ne veux pas abandonner la technologie. Cela dit, comme une solution de contournement, j'ai mis les fichiers nécessaires dans le dossier public et j'utilise Assets.at pour les inclure. –

+0

Je ne suis pas sûr de ce que le problème d'injection est. Mais vous pouvez éviter 'webjars-play' et utiliser le support WebJars intégré de sbt-web: https://www.playframework.com/documentation/2.5.x/AssetsOverview#WebJars –

+0

Merci, essayé que sans succès. Je vais juste placer les ressources dans le dossier public et les référencer en utilisant 'Assets.at' –