Скоростной доступ к динамическим свойствам

#java #velocity

#java #скорость

Вопрос:

Возможно ли динамически получать доступ к свойствам с помощью #evaluate? Заранее приношу извинения за длину, но большая часть этого — просто пример кода, полностью иллюстрирующий мою проблему.

У меня есть класс настроек, который выглядит следующим образом:

 public class DefaultUserPreferences implements Preferences {
    //Getters and setters left off for "brevity…"
    private Panel defaultPanel;
    private OrderByColumn mostActiveSortOrder;
    private OrderByColumn recentlyModifiedAccountsSortColumn;
}
  

Каждый из этих типов является просто пользовательским перечислением.

 public enum OrderByColumn {
    NAME,
    LAST_ACTIVITY,
    GROUP
}

public enum Panel {
    MOST_ACTIVE,
    RECENTLY_MODIFIED;

    public String getCamelCase() {
        String[] words = StringUtils.split(this.name(), "_");
        String rval = StringUtils.EMPTY;
        if (words != null amp;amp; words.length >= 1) {
            rval = StringUtils.lowerCase(words[0]);
            for(int i = 1; I < words.length; i  ) {
               rval  = StringUtils.capitalize(words[i].toLowerCase());
            }
        }
        return rval;
    }
}
  

Ниже приведен фрагмент того, как я хотел бы отобразить настройки для пользователей, но, похоже, я не могу вызвать средство получения (я получаю следующее, если оцениваю его для получения текста: test.core.model.entities.DefaultUserPreferences@596fde80.mostActiveSortOrder )

 #for ($panel in $Panels)
    ## The names here are correct
    #set($selectName = ${panel.CamelCase}SortColumn) 
    #set($dynamicProperty = $preferences.$selectName)
    <tr>
        <td>$panel</td>
        <td>
            <select name="$selectName">
                #for($option in $OrderByColumn)
                    <option value="$option" #if($option == #evaluate($dynamicProperty) selected="selected" #end>$option</option>
                #end
       </td>
    </tr>
#end
  

Однако мой getter, похоже, никогда не вызывается в настройках. Я добавил каждую из частей в контекст, и у меня не возникает никаких проблем с итерацией по панелям, я просто не могу разобраться с синтаксисом для динамического вызова методов получения в свойствах. Возможно ли это в версии 1.7?

Ответ №1:

Получил это из списка рассылки. В основном evaluate возвращает только строку для отображения вместо возврата значения. Таким образом, директива set требуется внутри вычисляемой строки.

 #set($selectName = "${panel.CamelCase}SortColumn")
#set($dynamicProp = '#set( $selectedPreference = '   '$preferences.'   $selectName)    ' )')
#evaluate($dynamicProp)
  

После выполнения этих строк я могу затем сравнить значение selectedPreference со значениями, которые я повторяю.

Комментарии:

1. Спасибо. Просматриваю FAQ, который указывает на VelocityTools. wiki.apache.org/velocity/VelocityFAQ