2014-05-02 4 views
0

Ситуация:Обращение в нуль Freemarker

  • Старый Java проект с использованием FreeMarker имеет много готовых шаблонов рабочих велик.
  • Каждый шаблон использует форму данных Объект транзакции.
  • Этот объект транзакции очень велик, поскольку обертывает все данные о транзакции.
  • В шаблонах много выражений вроде этого: get ("object1"). GetNestedObject2(). GetNestedObject3(). GetValue();

Проблема: появляются Новых требований: Все шаблоны должны быть процессом для предварительного просмотра без каких-либо реальных данных. Все номера должны быть нулевыми, и вся строка должна быть ---.

Неудовлетворительные решения:

  1. Remake все шаблоны для проверки нулевых значений. (Лот работы и небезопасен)
  2. Создайте объект Transaction, который содержит все значения по умолчанию. (Лот работы)

Ну, мой вопрос: могу ли я сказать Фримаркеру, что если он найдет нуль или найдет нуль на этом пути, то вместо этого он должен использовать 0, если он ожидал числа или, если он ожидал String.

Или вы можете увидеть лучшее решение?

Извините за мой английский.

+0

Какие версии Freemarker и Java вы используете? Кроме того, используете ли вы какие-либо другие рамки, которые помогут вам связать эти технологии? –

+0

Я использую freeMarker 2.3.20 и java 1.7. Нет, я не использую другие рамки. – tosovvoj

ответ

1

Если вам нужно показать модель шаблонов данных для шаблонов, лучший выбор - это, вероятно, обычай ObjectWrapper (см. Configuration.setObjectWrapper). Все, что читает модель данных, проходит через TemplateModel -s, а корень TemplateModel сделан ObjectWrapper, поэтому он может контролировать, какие значения получают шаблоны для имен. Но вопрос в том, когда вам нужно вернуть фиктивное значение для имени, как вы можете определить, каким будет его тип? Дело не только в том, что это будет строка или число, но также и если это будет метод (например, getNestedObject2) или хеш (что может сопровождаться .). Что может помочь, так это то, что FreeMarker позволяет иметь значение нескольких типов, поэтому вы можете вернуть значение, которое может использоваться как метод и как хэш и как строка, например. В зависимости от приложения, который может быть взломан, может быть, достаточно, но вам все равно нужно решить, является ли значение строкой или числом, потому что ${} напечатает числовое значение, если значение как строки, так и числа.