Scala ClassCastException当作为in的表示进行理解时
在PlayFramework2.4中,我尝试将所有控制器方法转换为JavaScript路由Scala ClassCastException当作为in的表示进行理解时,scala,playframework,classcastexception,for-comprehension,Scala,Playframework,Classcastexception,For Comprehension,在PlayFramework2.4中,我尝试将所有控制器方法转换为JavaScript路由 val jsRoutesClass = classOf[routes.javascript] val controllers = jsRoutesClass.getFields.map(_.get(null)) for ( controller <- controllers; method <- controller.getClass.getDeclaredMethods ) yie
val jsRoutesClass = classOf[routes.javascript]
val controllers = jsRoutesClass.getFields.map(_.get(null))
for (
controller <- controllers;
method <- controller.getClass.getDeclaredMethods
) yield method.invoke(controller).asInstanceOf[JavaScriptReverseRoute]
val jsrouteClass=classOf[routes.javascript]
val controllers=JSRouteClass.getFields.map(uq.get(null))
为了(
controller让我们一步一步地查看代码,并查看每行生成的内容。
我将您的代码转换为完整的示例代码,但我希望我抓住了您代码的精华
package controllers
import play.api._
import play.api.mvc._
class Sample extends Controller {
def hello(name: String) = Action {
implicit req =>
import routes.javascript._
val jsRoutesClass = classOf[routes.javascript]
val controllers = jsRoutesClass.getFields.map(_.get(null))
val met = for (
controller <- controllers;
method <- controller.getClass.getDeclaredMethods
) yield method
Ok(met.mkString(", "))
}
}
您应该可以从路由中找到所有方法,但请注意还有带有返回类型字符串的\u defaultPrefix()
方法
这就是第一个代码示例无法工作的原因。其中一个方法不返回JavaScriptReverseRoute
,因此引发异常
这仍然无法解释第二个代码示例不起作用的原因。因此,让我们向示例控制器添加一些代码:
package controllers
import play.api._
import play.api.mvc._
class Sample extends Controller {
def hello(name: String) = Action {
implicit req =>
import routes.javascript._
val jsRoutesClass = classOf[routes.javascript]
val controllers = jsRoutesClass.getFields.map(_.get(null))
val met = for (
controller <- controllers;
method <- controller.getClass.getDeclaredMethods
) yield method.invoke(controller)
Ok(met.mkString(", "))
}
}
仔细看,您会发现末尾有一个rogue,
,这意味着我们的临时val met
的值位于JavaScriptReverseRoute的位置0,位于位置1和空字符串
因此,请查看您的解决方法操作操作
导入routes.javascript_
val jsrouteClass=classOf[routes.javascript]
val controllers=JSRouteClass.getFields.map(uq.get(null))
val met=for(
控制器
package controllers
import play.api._
import play.api.mvc._
class Sample extends Controller {
def hello(name: String) = Action {
implicit req =>
import routes.javascript._
val jsRoutesClass = classOf[routes.javascript]
val controllers = jsRoutesClass.getFields.map(_.get(null))
val met = for (
controller <- controllers;
method <- controller.getClass.getDeclaredMethods
) yield method
Ok(met.mkString(", "))
}
}
public play.api.routing.JavaScriptReverseRoute controllers.javascript.ReverseSample.hello(), public java.lang.String controllers.javascript.ReverseSample._defaultPrefix()
package controllers
import play.api._
import play.api.mvc._
class Sample extends Controller {
def hello(name: String) = Action {
implicit req =>
import routes.javascript._
val jsRoutesClass = classOf[routes.javascript]
val controllers = jsRoutesClass.getFields.map(_.get(null))
val met = for (
controller <- controllers;
method <- controller.getClass.getDeclaredMethods
) yield method.invoke(controller)
Ok(met.mkString(", "))
}
}
JavaScriptReverseRoute(controllers.Sample.hello,
function(name) {
return _wA({method:"GET", url:"/" + (function(k,v) {return v})("name", encodeURIComponent(name))})
}
),
package controllers
import play.api._
import play.api.mvc._
class Sample extends Controller {
def hello(name: String) = Action {
implicit req =>
import routes.javascript._
val jsRoutesClass = classOf[routes.javascript]
val controllers = jsRoutesClass.getFields.map(_.get(null))
val met = for (
controller <- controllers;
method <- controller.getClass.getDeclaredMethods if method.getReturnType() == classOf[play.api.routing.JavaScriptReverseRoute]
) yield method.invoke(controller).asInstanceOf[play.api.routing.JavaScriptReverseRoute]
Ok(met.mkString(", "))
}
}