Передача Java-объекта в шаблон замыкания? - PullRequest
6 голосов
/ 29 января 2012

Насколько мне известно, шаблон Google Closure не позволяет передавать Java-объект в шаблон (по сравнению с FreeMarker ).Так что я не могу сделать что-то вроде:

// Java file
class Course {
  ...
  public function getName() {
    return name;
  }
}

// Main function
public static void main(String args[]) {
  // Get all courses
  List<Course> courses = Courses.getAllCourses();
  Map<String, Object> params = new HashMap<String, Object>();
  params.put("courses", courses);

  String out = tofu.newRenderer("template.listCourses").setData(params);
}

// Soy file
/**
 * @param courses List of courses
 */
{template .listCourses}
  Courses List! <br/>

  {foreach $course in $courses}
        New Course: {$course.name}
  {/foreach}
{/template}

Я думаю, что если я хочу сделать это, мне, вероятно, придется написать пользовательскую функцию, которая использует Reflection, чтобы превратить объект курса в карту?У меня нет опыта работы с Java Reflection.Доступна ли такая функция?

1 Ответ

7 голосов
/ 06 февраля 2012

В plovr я создал утилиту SoyDataUtil.java , которая берет JsonElement и преобразует его в SoyData .По общему признанию, вы можете найти это полезным, только если вы уже используете Gson , но хорошая особенность этого подхода заключается в том, что Gson, вероятно, позаботится об отражении получателя / установщика за вас.Например, я полагаю, что вы должны сделать:

JsonElement json = (new Gson()).toJsonTree(courses);
SoyData soyData = SoyDataUtil.jsonToSoyData(json); 

Map<String, Object> params = new HashMap<String, Object>();
params.put("courses", soyData);

Хитрость заключается в том, чтобы использовать Gson для отражения, чтобы превратить courses в JsonElement.Не уверен, готовы ли вы добавить эти зависимости (хотя код из plovr довольно мал - вы можете просто скопировать его напрямую), но это может быть наиболее целесообразным решением.

...