#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. есть идеи, как вызвать эту функцию со строковым аргументом?
${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}
. См. Ссылку