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

나는이 작업을 수행하려면 내가 아마지도에 코스 객체를 설정하는 반사를 사용하는 사용자 정의 함수를 작성해야 생각 해요? 나는 자바 리플렉션에 익숙하지 않다. 그런 기능이 있습니까?

답변

7

plovr에서 나는 JsonElement을 가지고 SoyData으로 변환하는 유틸리티 인 SoyDataUtil.java을 만들었습니다. 비록 여러분이 이미 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); 

트릭은 JsonElementcourses을 설정하는 반사에 할 GSON을 활용한다. 이러한 종속성을 추가 할 의향이 있는지는 잘 모르겠지만 (plovr의 코드는 아주 작습니다. 직접 복사 할 수는 있지만) 가장 적합한 솔루션 일 수 있습니다.

+0

initilaizing params.put 문은 괜찮습니다. 다음으로이 값 (soydata)을 템플릿에 어떻게 전달할 수 있습니까? – gokul