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}

これを行いたい場合、リフレクションを使用して Course オブジェクトを Map に変換するカスタム関数を作成する必要があると思いますか? 私は Java リフレクションの経験がありません。そのような機能はありますか?

4

1 に答える 1

7

plovr で、ユーティリティSoyDataUtil.javaを作成しました。これは JsonElement を受け取り、それをSoyDataに変換します確かに、既にGsonを使用している場合にのみこれが役立つと思うかもしれませんが、このアプローチの良い点は、Gson がゲッター/セッター リフレクションを処理してくれる可能性が高いことです。たとえば、次のことができるはずです。

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

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

トリックは、Gson を利用して、リフレクションを にcourses変換することJsonElementです。これらの依存関係を追加するかどうかはわかりませんが (plovr のコードは非常に小さいため、直接コピーするだけでかまいません)、これが最も適切な解決策かもしれません。

于 2012-02-05T21:36:42.507 に答える