2012-01-29 34 views
6

Theo như tôi biết, Mẫu đóng cửa của Google không cho phép truyền đối tượng Java vào mẫu (so với FreeMarker). Vì vậy, tôi không thể thực sự làm điều gì đó như:Chuyển đối tượng Java vào mẫu đóng?

// 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} 

Tôi nghĩ rằng nếu muốn thực hiện điều này, tôi có thể phải viết chức năng tùy chỉnh sử dụng Reflection để biến đối tượng Course thành Bản đồ? Tôi không có kinh nghiệm với Java Reflection. Có chức năng như vậy không?

Trả lời

7

Trong plovr, tôi đã tạo một tiện ích, SoyDataUtil.java, mất JsonElement và chuyển đổi thành SoyData. Phải thừa nhận rằng, bạn chỉ có thể thấy điều này hữu ích nếu bạn đã sử dụng Gson, nhưng điều tốt đẹp về cách tiếp cận này là Gson có khả năng chăm sóc phản xạ getter/setter cho bạn. Ví dụ, tôi tin rằng bạn sẽ có thể làm:

JsonElement json = (new Gson()).toJsonTree(courses); 
SoyData soyData = SoyDataUtil.jsonToSoyData(json); 

Map<String, Object> params = new HashMap<String, Object>(); 
params.put("courses", soyData); 

Bí quyết được tận dụng Gson phải làm gì để sự phản ánh để biến courses thành một JsonElement. Không chắc chắn liệu bạn có sẵn lòng thêm những phụ thuộc này hay không (mặc dù mã từ plovr là khá nhỏ - bạn chỉ có thể sao chép trực tiếp), nhưng đây có thể là giải pháp tốt nhất.

+0

initilaizing câu lệnh params.put là tốt, tiếp theo, làm cách nào tôi có thể chuyển giá trị này (soydata) cho các mẫu. – gokul

Các vấn đề liên quan