6

据我所知,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}

我在想,如果我想这样做,我可能必须编写一个使用反射将课程对象转换为地图的自定义函数?我对 Java 反射没有经验。有这样的功能吗?

4

1 回答 1

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 的代码很小——您可以直接复制它),但这可能是最方便的解决方案。

于 2012-02-05T21:36:42.507 回答