2012-01-29 1 views
6

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

// 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. Есть ли такая функция?

ответ

7

В 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 довольно мал - вы можете просто скопировать его напрямую), но это может быть наиболее целесообразным решением.

+0

инструкция инициализации params.put в порядке, следующая, как я могу передать это значение (soydata) в шаблоны. – gokul

 Смежные вопросы

  • Нет связанных вопросов^_^