Извините за задержку.После некоторой хорошей помощи в списках рассылки о местах установки точек останова, вот что я написал в список 10 июня:
Короткая история: Это не проблема Freemarker.Скорее всего, команда Struts решила использовать Freemarker для обработки имен .vars
как выражений OGNL, и, похоже, нет способа заставить OGNL не их анализировать.Таким образом, в Struts «-» и «+» (и, возможно, другие символы) не могут появляться в именах .vars
.
Длинная история ...
freemarker.core.BuiltinVariable
(строка 192) - это место, где Freemarker начинает обрабатывать .vars
выражений
freemarker.core.Environment
(строка 1088) передает управление «rootDataModel», которыйКоманда Struts, жестко привязанная к экземпляру org.apache.struts2.views.freemarker.ScopesHashModel
строки 70 этого класса (использует версию Struts) 2.1.8.1, вызывает "stack.findValue";«стек» был задан как экземпляр com.opensymphony.xwork2.ognl.OgnlValueStack
в строке 236, и этот класс, в свою очередь, запрашивает экземпляр OgnlUtil
для поиска объекта, и именно там имяпредполагается, что это выражение OGNL, и анализируется, превращая «foo-bar» в (foo - bar)
Ни в одной точке пути не существует выбора НЕтрактуйте имя .vars
как выражение (комментарий в FreemarkerResult
намекает на возможность, но код не выполняется).В теории моя реализация FreemarkerManager
могла бы создать вариант ScopesHashModel
, но для изменения всех связанных с ним классов потребовалось бы много работы.
(И, похоже, не существуетспособ экранирования символов "-" в выражениях OGNL. Кажется, 5-6 лет назад обсуждалось это, но .... .vars( "foo\\-bar" )
не удается найти "-" после "\", так что предположительно "-" isn 't escapable?)
: - (
Мне не ясно, каков вариант использования для обработки .vars
имен как выражений ... но я не думаю, что Struts собираетсячтобы изменить, теперь. Вместо того, чтобы переопределять полдюжины классов Struts, я вместо этого изменил код, который загружает наши ResourceBundles в стек значений: теперь он меняет имена, заменяя "-" и "_", а также мои .vars
именаизменяются одинаково в шаблоне и ... тада. работает. Ву.