Obtener los nombres de variables locales en la Scala de Jugar!Mailer() devuelve un vacío?
-
29-10-2019 - |
Pregunta
Tengo una aplicación mediante el Juego!marco.Estoy enlazando las variables a las plantillas y la construcción de lo que podría ser un salvavidas rasgo para Jugar!: https://github.com/asinghal/Play-ScalaGen/blob/master/misc_utils/EmailNotifier.scala
var templateHtmlBinding = new java.util.HashMap[String, Object]()
var templateTextBinding = new java.util.HashMap[String, Object]()
for (o <- args) {
val names = LocalVariablesNamesTracer.getAllLocalVariableNames(o).toList
for (name <- names) {
templateHtmlBinding += (name -> o)
templateTextBinding += (name -> o)
}
}
El problema es que al hacer un getAllLocalVariableNames
en line 155
la lista completa devuelve un vacío.Puedo confirmar que los objetos se pasa a la función son nulas, según lo verificado por la impresión de los mismos en el interior de la función.Me pregunto si hay algo mal uso de este en la Scala o si alguien sabe de un método de reflexión que podría hacer el trabajo?
Editar
Estoy tratando un poco de reflexión, pero mi reflexión el conocimiento es algo limitado.Un ejemplo:
val names = o.getClass.getMethods.toList.map(_.toString)
Salida a partir de una muestra de objetos de pasado:
List(public java.lang.String models.Account.name(), public static final scala.Op
tion models.Account.get(long), public boolean models.Account.equals(java.lang.Ob...
Alguna idea de cómo filtrar esta más?
Segunda Edición
He llegado a este punto que logró que produce una lista de cada uno de los objetos y sus propiedades, pero, por desgracia, todavía desencadena el mismo error con una poblada lista:
val oname = o.getClass.getName.replaceAll("models.","").toLowerCase
val names = o.getClass.getDeclaredFields.toList.map(_.getName.toString).map(oname+"."+_)
da:
List(account.id, account.name, account.address,...
Alguna idea sobre donde algo va mal en el Juego!plantillas?
Solución
Como en Edit 2, pude obtener los nombres de propiedad de cada objeto que pasaron. Sin embargo, el problema que tuve fue causado por la clase misma, por lo que modifiqué un par de cosas para solucionarlo. Creé esto:
for ((name:String, o:Object) <- args) {
templateHtmlBinding += (name -> o)
templateTextBinding += (name -> o)
}
y reemplazaron las líneas 153-159:
for (o <- args) {
var names = LocalVariablesNamesTracer.getAllLocalVariableNames(o).toList
for (name <- names) {
templateHtmlBinding += (name -> o)
templateTextBinding += (name -> o)
}
}
¡Parece que no puedes obtener nombres de variables si quieres expandirte fuera del juego! controladores y desordenarse. Entonces, una solución es simplemente pasar los nombres de variables de plantilla como este:
mail.send("app/views/Mails/invite", "account"->account, "user"->user )
y referencia en su plantilla como:
${account.name}