メソッド呼出時、引数にJSON(マップ)を渡せます。

Javaのテンプレートエンジン Velocityでメソッド呼出時、引数にJSONを渡せます。
色々いじってみて知りました。
方法は引数のところに{ "key1": "value1"....のように普段のJSONと同じく書けばいいです。
実際メソッドの引数に渡されるオブジェクトはMapです。
以下のサンプルを参照して下さい。

import java.io.StringWriter;
import java.util.Map;

import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;

public class TestVelocityJson {
    // テンプレートで使うBeanクラス。
    public static class TestBean {
        public void duke(Map<String, Object> t) {
            // 適切にキャストして使用します。
            String param1 = (String) t.get("param1");
            int param2 = (int) t.get("param2");
            System.out.println("param1: " + param1);
            System.out.println("param2: " + param2);
        }
    }

    public static void main(String[] args) throws Exception {
        {
            // メソッド呼出。
            String template =
                "${testBean.duke({\"param1\" : \"v1\", \"param2\": 11})} ";
            Context vc = new VelocityContext();
            vc.put("testBean", new TestBean());
            StringWriter sw = new StringWriter();
            System.out.println("-- Test1 -- ");
            Velocity.evaluate(vc, sw, "test", template);
            /*
             * 結果
             * -- Test1 --
             * param1: v1
             * param2: 11
             */
        }
        {
            // マクロからメソッド呼出。
            String template =
                "#macro(dukeTest $p) " +
                "  $testBean.duke($p) " +
                "#end " +
                "#dukeTest({\"param1\" : \"v2\", \"param2\": 22})";

            Context vc = new VelocityContext();
            vc.put("testBean", new TestBean());
            StringWriter sw = new StringWriter();
            System.out.println("-- Test2 -- ");
            Velocity.evaluate(vc, sw, "test", template);
            /*
             * 結果
             * -- Test2 --
             * param1: v2
             * param2: 22
             */
        }
    }
}