【问题标题】:Error injecting constructor, java.lang.ClassCastException: Play 2.5.4 - Scala注入构造函数时出错,java.lang.ClassCastException:播放 2.5.4 - Scala
【发布时间】:2016-08-06 11:15:45
【问题描述】:

我正在尝试创建一个基于Play documentation 的日志过滤器,但我不知道发生了什么。

我收到了 thios 错误消息:

Unexpected exception ProvisionException: Unable to provision,参见 以下错误:

1) 注入构造函数时出错,java.lang.ClassCastException: [Ljava.lang.Object;不能转换为 [Lplay.mvc.EssentialFilter;在 Filters.(Filters.scala:11) while locating Filters while 定位 play.http.HttpFilters 对于 play.api.http.JavaHttpFiltersAdapter.(HttpFilters.scala:63)
中的参数 0 定位时 play.api.http.JavaHttpFiltersAdapter 定位时 play.api.http.HttpFilters 对于 play.api.http.JavaCompatibleHttpRequestHandler.(HttpRequestHandler.scala:200) 中的参数 3 同时定位 play.api.http.JavaCompatibleHttpRequestHandler 而 定位 play.api.http.HttpRequestHandler 对于 play.api.DefaultApplication.(Application.scala:221) 中的参数 4 play.api.DefaultApplication.class(Application.scala:221) 而 在定位时定位 play.api.DefaultApplication play.api.Application

1 个错误

但我的 LoggingFilter 扩展了 EssentialFilter(我复制了文档代码)。 我需要为 Guice 绑定一些东西吗?

这是我的built.sbt:

    name := """abc"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  jdbc,
  cache,
  ws,
  filters,
  "org.scalatestplus.play" %% "scalatestplus-play" % "1.5.1" % Test,
  "org.webjars" %% "webjars-play" % "2.5.0",
  "org.webjars" % "react" % "0.13.1"
)

resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases"

routesGenerator := InjectedRoutesGenerator

这里是我的 plugins.sbt :

// The Typesafe repository
resolvers += "Typesafe repository" at "https://repo.typesafe.com/typesafe/releases/"

// Eclpise Plugin
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")

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

// 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.3")

addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.7")

addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0")

addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.2")

// transform JSX assets to js
addSbtPlugin("com.github.ddispaltro" % "sbt-reactjs" % "0.5.0")

【问题讨论】:

  • 你把你的类放在根包里了吗?如果没有,你应该在你的 conf 中添加这个:play.http.filters=com.example.MyFilters。另外,检查您的导入是否正确..
  • 是的,insan-e,我做了与文档中解释的相同的操作:application.conf 中的“play.http.filters = Filters”和 app/ 文件夹中的“Filters”类。
  • 我也有这个问题。我正在使用 java 并且我完全按照文档进行操作
  • 有没有人找到解决这个问题的方法。我有完全相同的问题。按照文档添加 CORSFilter。 playframework.com/documentation/2.5.x/CorsFilter

标签: scala playframework-2.0 code-injection


【解决方案1】:

看起来这是 DefaultHttpFilters 类的构造函数中的一个错误。该错误出现在 2.5.4 中,并将在 2.5.5 里程碑中修复,该里程碑尚不可用且没有截止日期。我也想要一个解决方法。

问题的网址:https://github.com/playframework/playframework/pull/6238

【讨论】:

    【解决方案2】:

    我不知道这是否能帮助你们解决这个问题。但我确实让我的 CORSFilter 工作了。 (播放 2.5.4)

    import com.google.inject.Inject;
    import play.http.HttpFilters;
    import play.mvc.EssentialAction;
    import play.mvc.EssentialFilter;
    import play.filters.cors.CORSFilter;
    
    public class MyFilters extends EssentialFilter implements HttpFilters {
    
        @Inject
        private CORSFilter corsFilter;
    
    
        @Override
        public EssentialAction apply(EssentialAction next) {
            return corsFilter.asJava().apply(next);
        }
    
        @Override
        public EssentialFilter[] filters() {
            EssentialFilter[] result = new EssentialFilter[1];
            result[0] = this;
    
            return result;
        }
    }
    

    也将此添加到 application.conf 中

    play.filters.cors{
    # allow all paths
      pathPrefixes = ["/"]
      # allow all origins
      allowedOrigins = null
      allowedHttpMethods = ["GET", "POST", "PUT", "DELETE"]
      # allow all headers
      allowedHttpHeaders = null
    }
    

    【讨论】:

      【解决方案3】:
      @Singleton
      public class Filters implements HttpFilters {
      
          private final Environment env;
          private final CORSFilter corsFilter;
      
          @Inject
          public Filters(Environment env, CORSFilter corsFilter) {
              this.env = env;
              this.corsFilter = corsFilter;
          }
      
          @Override
          public EssentialFilter[] filters() {
              return new EssentialFilter[] { corsFilter.asJava() };
          }
      
      }
      

      重点是:corsFilter.asJava()

      【讨论】:

        猜你喜欢
        • 2019-05-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-09
        • 2016-04-11
        相关资源
        最近更新 更多