2012-01-29 21 views
6

Por lo que sé, Google Closure Template no permite pasar objetos Java a la plantilla (en comparación con FreeMarker). Así que no puedo hacer algo como:Pasando el objeto Java a la plantilla de cierre?

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

Estoy pensando si quiero hacer esto probablemente que escribir una función personalizada que utiliza la reflexión para convertir objetos de golf en un mapa? No tengo experiencia con Java Reflection. ¿Hay tal función disponible?

Respuesta

7

En plovr, creé una utilidad, SoyDataUtil.java, que toma JsonElement y la convierte en SoyData. Es cierto que solo puede encontrarlo útil si ya usa Gson, pero lo bueno de este enfoque es que es probable que Gson se encargue del reflejo del captador/instalador. Por ejemplo, creo que debería ser capaz de hacer:

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

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

El truco está aprovechando Gson hacer a la reflexión a su vez en un coursesJsonElement. No estoy seguro de si está dispuesto a agregar estas dependencias (aunque el código de plovr es bastante pequeño, puede copiarlo directamente), pero esta puede ser la solución más conveniente.

+0

initilaizing params.put statement está bien, a continuación, ¿cómo puedo pasar este valor (soydata) a las plantillas. – gokul

Cuestiones relacionadas