[Play 2.4.1] Get Injected Controller using Reflection API

28 views
Skip to first unread message

francis...@valraiso.fr

unread,
Jul 3, 2015, 6:30:59 AM7/3/15
to play-fr...@googlegroups.com
Hi all,

I try access a method located in a controller using the reflection API.
I have this Controller :
class HomeController @Inject()(val messagesApi: MessagesApi) extends Controller with I18nSupport {

  def home = JeAction.async { implicit request =>

    Future(Ok("It works"))
  }
}

I try to access my home method using the reflection API :

val runtime: JavaUniverse = scala.reflect.runtime.universe
val mirror: runtime.Mirror = runtime.runtimeMirror(this.getClass.getClassLoader)
val controller: Class[_] = mirror.runtimeClass(mirror.staticClass("controllers.HomeController"))
val instanceMirror = mirror.reflect(controller)
val controllerInstance: Any = instanceMirror.instance
val method: runtime.MethodSymbol = mirror.typeOf[HomeController].decl(runtime.TermName("home")).asMethod
val action: Action[AnyContent] = instanceMirror.reflectMethod(method).apply().asInstanceOf[Action[AnyContent]]

Last line generate the follow Exception :
scala.ScalaReflectionException: expected a member of class Class, you provided method controllers.HomeController.home
at scala.reflect.runtime.JavaMirrors$JavaMirror.scala$reflect$runtime$JavaMirrors$JavaMirror$$abort(JavaMirrors.scala:115) ~[scala-reflect-2.11.6.jar:na]
at scala.reflect.runtime.JavaMirrors$JavaMirror.scala$reflect$runtime$JavaMirrors$JavaMirror$$ErrorNotMember(JavaMirrors.scala:121) ~[scala-reflect-2.11.6.jar:na]
at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$scala$reflect$runtime$JavaMirrors$JavaMirror$$checkMemberOf$1.apply(JavaMirrors.scala:214) ~[scala-reflect-2.11.6.jar:na]
at scala.reflect.runtime.JavaMirrors$JavaMirror.ensuringNotFree(JavaMirrors.scala:204) ~[scala-reflect-2.11.6.jar:na]
at scala.reflect.runtime.JavaMirrors$JavaMirror.scala$reflect$runtime$JavaMirrors$JavaMirror$$checkMemberOf(JavaMirrors.scala:213) ~[scala-reflect-2.11.6.jar:na]
at scala.reflect.runtime.JavaMirrors$JavaMirror$JavaInstanceMirror.reflectMethod(JavaMirrors.scala:247) ~[scala-reflect-2.11.6.jar:na]
at scala.reflect.runtime.JavaMirrors$JavaMirror$JavaInstanceMirror.reflectMethod(JavaMirrors.scala:233) ~[scala-reflect-2.11.6.jar:na]

Can someone help me fixinh this?

Francis
Reply all
Reply to author
Forward
0 new messages