2012-01-29 32 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} 

我在想,如果我想这样做,我可能不得不写使用反射转场对象到地图自定义函数?我对Java Reflection没有经验。有没有这样的功能?

回答

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做反射转coursesJsonElement。不知道你是否愿意添加这些依赖关系(尽管plovr的代码很小 - 你可以直接复制它),但这可能是最方便的解决方案。

+0

initilaizing params.put语句是好的,接下来,我如何将这个值(soydata)传递给模板。 – gokul 2014-04-22 11:49:11