Получение имен локальных переменных в Scala Play! Mailer () возвращает пустое значение? - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть приложение, использующее 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,весь список возвращается пустым.Я могу подтвердить, что объекты, переданные в функцию, не являются нулевыми, как проверено, распечатав их внутри функции.Мне интересно, если что-то не так, используя это в 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,...

Любое понимание того, что что-то не так в игре!шаблонный

1 Ответ

0 голосов
/ 22 февраля 2012

Как и в Edit 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}
...