Pregunta ¿Pasar el objeto Java a la plantilla de cierre?


Por lo que sé, Google Closure Template no permite pasar objetos Java a la plantilla (en comparación con FreeMarker) Entonces realmente no puedo hacer algo como:

// 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 que si quiero hacer esto, probablemente tenga que escribir una función personalizada que use Reflection para convertir el objeto del curso en un mapa. No tengo experiencia con Java Reflection. ¿Hay tal función disponible?


6
2018-01-29 02:36


origen


Respuestas:


En plovr, he creado una utilidad, SoyDataUtil.java, que toma una JsonElement y lo convierte en un SoyData. Es cierto que solo puede encontrarlo útil si ya está usando Gson, pero lo bueno de este enfoque es que es probable que Gson se encargue de la reflexión de captador / instalador para usted. Por ejemplo, creo que deberías poder 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 a Gson para hacer al reflejo para activar courses en un JsonElement. 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.


7
2018-02-05 21:36