【问题标题】:Cannot load play.http.errorHandler无法加载 play.http.errorHandler
【发布时间】:2026-01-03 10:35:01
【问题描述】:

我在 Scala 中使用 Play 来开发一个网站。我在application.conf 文件中添加了以下行,以便包含默认错误处理:

play.http.errorHandler = play.api.http.HtmlOrJsonHttpErrorHandler

我是根据official documentation 的建议完成的。但是,当我添加此行时,出现以下错误:

play.api.PlayException: Cannot load play.http.errorHandler[play.http.errorHandler [play.api.http.HtmlOrJsonHttpErrorHandler] was not loaded.]
at play.utils.Reflect$.loadClass$1(Reflect.scala:111)
at play.utils.Reflect$.configuredClass(Reflect.scala:124)
at play.utils.Reflect$.bindingsFromConfiguration(Reflect.scala:50)
at play.api.http.HttpErrorHandler$.bindingsFromConfiguration(HttpErrorHandler.scala:54)
at play.api.inject.BuiltinModule$$anonfun$$lessinit$greater$1.$anonfun$new$2(BuiltinModule.scala:85)
at play.api.inject.BuiltinModule$$anonfun$$lessinit$greater$1.$anonfun$new$1(BuiltinModule.scala:35)
at scala.collection.TraversableLike.$anonfun$flatMap$1(TraversableLike.scala:241)
at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:32)
at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:29)
at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:38)
Caused by: java.lang.ClassNotFoundException: play.api.http.HtmlOrJsonHttpErrorHandler
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at play.utils.Reflect$.loadClass$1(Reflect.scala:105)
    at play.utils.Reflect$.configuredClass(Reflect.scala:124)
    at play.utils.Reflect$.bindingsFromConfiguration(Reflect.scala:50)
    at play.api.http.HttpErrorHandler$.bindingsFromConfiguration(HttpErrorHandler.scala:54)
    at play.api.inject.BuiltinModule$$anonfun$$lessinit$greater$1.$anonfun$new$2(BuiltinModule.scala:85)
    at play.api.inject.BuiltinModule$$anonfun$$lessinit$greater$1.$anonfun$new$1(BuiltinModule.scala:35)
    at scala.collection.TraversableLike.$anonfun$flatMap$1(TraversableLike.scala:241)

这是我访问 localhost 时得到的屏幕截图:

知道为什么会发生这种情况以及如何解决吗?

【问题讨论】:

  • HtmlOrJsonHttpErrorHandler 从 Play 2.7 开始可用。您使用的是哪个版本的 Play?
  • 在哪里可以轻松看到这个?我在 build.sbt 文件 version = 2.6.x 中找到了这个。
  • 我还发现了这个链接:playframework.com/documentation/2.4.x/ScalaErrorHandling 这是一个早期版本,他们也使用默认的错误处理程序。

标签: scala playframework playframework-2.3


【解决方案1】:

Comparing changes 在 Play 2.6.25 和 2.7.0 之间我们推断HtmlOrJsonHttpErrorHandler 是由Add an HttpErrorHandler that selects the client's preferred media type #8540 引入的。项目中使用的 Play 版本应在 project/plugins.sbt 下指定,例如

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.0")

如果您使用的是 2.6.0,请按照 migration guide 到 2.7。

【讨论】:

  • 你确定问题出在HtmlOrJsonHttpErrorHandler 而不是play.http.errorHandler?据我了解,这条线应该在 Play 2.6 play.http.errorHandler = DefaultHttpErrorHandler 中工作,但是,它返回相同的错误。
  • 顺便说一句,我有addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.19"),我刚刚验证过。如果我能找到一种方法来使用这个版本引入一些默认的错误处理,我认为这会比迁移到 2.7 更好。
  • @Arno 您必须向错误处理程序 play.http.errorHandler = play.api.http.DefaultHttpErrorHandler 提供完全限定名称。