在Scala Play中获取本地变量名称! Mailer()返回空?

时间:2012-02-22 05:37:56

标签: java scala playframework local-variables

我有一个使用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中出现问题的任何见解!模板?

1 个答案:

答案 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}