2012-05-05 3 views
3

StringTemplate позволяет программистам извлекать данные через геттеры (функция без аргументов).Вызов функции Java с аргументами из StringTemplate?

Я хотел бы знать, что можно вызвать функцию Java с аргументами из String Template?

+0

Не совсем. Это позволит «выполнять код» и нарушать разделение. Однако поддержка формата атрибута - например, 'format =" 1,2,3,4 "' можно было бы злоупотреблять ... –

+1

Также можно искусственно моделировать функционально-подобное поведение, создав карту и введя в нее некоторые значения и ожидаемые результаты. Затем вы можете использовать такую ​​карту, как функцию в шаблоне: machinery

ответ

0

Существует обход, злоупотребляющий словарями. Ниже приведен пример реализации «функции» для ограничения количества элементов в списке (issue on github).

В коде добавления словаря:

group.defineDictionary("max", new MaxListItemsLimiter());

Использование (в этом примере первый элемент в массиве макс число пунктов.):

<max.(["50",myObject.items]):{msg|<msg.something>}>

final class MaxListItemsLimiter extends AbstractMap<String, Object> { 

    @Override 
    public Object get(Object key) { 
     List items = (List) key; 
     if (!items.isEmpty()) { 
      //First item is max. count 
      Integer limit = NumberUtils.toInt(items.get(0).toString(), -1); //use Integer.parseInt 
      if (limit != -1) { 
       return items.subList(1, Math.min(items.size(), limit + 1)); 
      } else { 
       throw new AssertionError("First parameter in max must be number"); 
      } 
     } else { 
      return super.get(key); 
     } 
    } 

    @Override 
    public Set<Map.Entry<String, Object>> entrySet() { 
     return Collections.emptySet(); 
    } 

    @Override 
    public boolean containsKey(Object key) { 
     if (key instanceof List) { 
      return true; 
     } else { 
      throw new AssertionError("You can use max only on Lists."); 
     } 
    } 
} 
Смежные вопросы