据我所知,Google Closure Template不允许将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将Course对象转换为Map?我对Java Reflection没有经验。有这样的功能吗?
答案 0 :(得分:7)
在plovr中,我创建了一个实用程序SoyDataUtil.java,它使用JsonElement并将其转换为SoyData。不可否认,如果你已经使用Gson,你可能只会觉得这很有用,但这种方法的好处是Gson可能会为你处理getter / setter反射。例如,我相信你应该能够做到:
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的代码非常小 - 你可以直接复制它),但这可能是最方便的解决方案。