2012-01-29 70 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