我有一个使用Play的应用程序!框架。我将变量绑定到模板,并建立在Play可能是一个救命的特质!: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)
}
}
问题是,当您在getAllLocalVariableNames
上执行line 155
时,整个列表将返回空。我可以确认传入函数的对象不是null,因为通过在函数内打印它们来验证。我想知道在Scala中使用它是否有问题,或者是否有人知道可以完成这项工作的反射方法?
我正在尝试一些反思,但我的反思知识有点受限。样本:
val names = o.getClass.getMethods.toList.map(_.toString)
传入的样本对象的输出:
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...
知道如何进一步过滤这个吗?
我已经到目前为止成功生成了每个对象及其属性的列表,但遗憾的是它仍然会在填充列表中触发相同的错误:
val oname = o.getClass.getName.replaceAll("models.","").toLowerCase
val names = o.getClass.getDeclaredFields.toList.map(_.getName.toString).map(oname+"."+_)
给出:
List(account.id, account.name, account.address,...
有关Play中出现问题的任何见解!模板?
答案 0 :(得分:0)
在编辑2中,我能够获取传入的每个对象的属性名称。但是,我遇到的问题实际上是由类本身引起的,所以我修改了一些东西来修复它。我创造了这个:
for ((name:String, o:Object) <- args) {
templateHtmlBinding += (name -> o)
templateTextBinding += (name -> o)
}
并更换了第153-159行:
for (o <- args) {
var names = LocalVariablesNamesTracer.getAllLocalVariableNames(o).toList
for (name <- names) {
templateHtmlBinding += (name -> o)
templateTextBinding += (name -> o)
}
}
如果你想在Play之外扩展,你似乎无法获得变量名称!控制器变得凌乱。所以修复就是简单地传递模板变量名,如下所示:
mail.send("app/views/Mails/invite", "account"->account, "user"->user )
并在模板中引用,如:
${account.name}