Функция Freemarker, возвращающая значение карты

#java #freemarker

#java #freemarker

Вопрос:

У меня есть какая-то карта на Java

     Map<SomeEnum, Boolean> someClassMap = new HashMap <SomeClass, Boolean>();
    someClassMap.put(SomeEnum.EXAMPLE_A, true);
    etc.
  

теперь в ftl я хотел бы создать функцию, которая будет возвращать значение с карты (ofc по заданному ключу)

 <#function checkAccess someEnumName>
    <#list someClassMap?keys as key>
        <#if someEnumName== ${key}>
            <#return ${someClassMap[key]} >
        </#if>
    </#list> 
</#function>
  

Итак, этот код предполагает проверку, равен ли данный параметр в функции ключу из карты, а затем возвращает значение этого ключа из карты.

К сожалению, я получаю эту ошибку (она указывает на <#if> и <#return> :

Обнаружен «{» в строке 3, столбец 37 в functions.ftl. Ожидал одного из: «>» … «.» … «[» … «(» … «?» … «!» … … «??» … » » … «-» … «*» … «/» … «%» … «>=» … … «>» … … … … «..» … … …

Насколько я понимаю, я не могу возвращать подобные значения, но, к сожалению, я понятия не имею, как это сделать. Я также пытался <#assign ... > , но появляется та же ошибка

Ответ №1:

В вашем случае вы смешиваете теги Freemarker с интерполяцией (${}).
Freemarker пытается отобразить / распечатать строковое значение x при вызове ${x} .


Поэтому, когда вы делаете:

 <#if someEnumName== ${key}>
  

и

 <#return ${someClassMap[key]} >
  

Freemarker попытается напечатать ${key} и ${someClassMap[key]} .


Смешивание интерполяции в тегах Freemarker является неправильным синтаксисом, что вызывает жалобы Freemarker.
Просто удалите ${}, и все должно быть в порядке.

Для получения дополнительной информации см. Следующее:

  1. Структура шаблона Freemarker (интерполяция по сравнению с тегами Freemarker)
  2. Интерполяция (проверьте раздел с надписью «Внимание!»)

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

1. есть идеи, как вызвать эту функцию со строковым аргументом? ${checkAccess("test") у меня не работает, также, если я назначаю test переменной и передаю эту переменную в качестве функции аргумента, она тоже не работает

2. Я не уверен, что означает «не работает», но я предполагаю, что <#if someEnumName== ${key}> никогда не бывает истинным, поэтому вы никогда ничего не возвращаете. Возможные проблемы: 1. someClassMap?keys пусто, поэтому вы никогда не выполняете итерацию с помощью <#list someClassMap?keys как ключ> 2. someEnumName — это строка, а key — это SomeEnum . Когда вы сравниваете someEnumName== key , возможно, что выполняемое сравнение является someEnumName== key . toString() , который может быть не тем, что вы ожидаете.

3. checkAccess("test") возвращает логическое значение, поэтому ${true} будет выведено true и ${false} ничего не будет напечатано. Поэтому вместо этого попробуйте ${checkAccess("test")?string} . См. Ссылку