Ссылка на карту по имени в шаблоне скорости - PullRequest
2 голосов
/ 26 февраля 2010

Уверен, что на этот вопрос есть простой ответ, но просто не могу найти правильный синтаксис VTL.

В моем контексте я передаю Карту, которая содержит другие Карты. Я хотел бы сослаться на эти внутренние карты по имени и назначить их в моем шаблоне. Внутренние карты создаются различными частями приложения, а затем добавляются в контекст

в качестве примера

public static void main( String[] args )
    throws Exception
{

    VelocityEngine ve = new VelocityEngine();
    ve.init();
    Template t = ve.getTemplate( "test.vm" );
    VelocityContext context = new VelocityContext();

    Map<String,Map<String,String>> messageData = new HashMap<String, Map<String,String>>();


    Map<String,String> data_map = new HashMap<String,String>();
    data_map.put("data_1","1234");
    data_map.put("a_date", "31-Dec-2009");

    messageData.put("inner_map", data_map);

    context.put("msgData", messageData);
    StringWriter writer = new StringWriter();

    t.merge( context, writer );
    System.out.println( writer.toString() );
}

Шаблон - test.vm

#set ($in_map =  $msgData.get($inner_map) )

data:

    $in_map.data_1
    $in_map.a_date  

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

Попробуйте

${in_map.get("data_1")}

или

${in_map.get("a_date")}
0 голосов
/ 13 марта 2010

Полученный ответ не сработал для меня, но заставил меня задуматься о проблеме по-другому. Я решил эту проблему, создав метод, который может искать подразделы данных на основе строки и возвращать список карт.

#set( $data = $confirmData.getCollection("MSG_DATA").get(0) )

Это работает даже в том случае, если ваши базовые данные являются документом XML, так как вы можете передать xPath и заставить метод возвращать карту tagName tagValues. Это обеспечивает большую гибкость.

#set( $data = $confirmData.getCollection("//Message/header[sendFrom='xxx']").get(0) )
...