2015-02-07 5 views
2

Я пытаюсь вызвать метод Java в своем шаблоне FreeMarker, который использует общедоступную статическую переменную Java как один из ее параметров. Например, если код FreeMarker в test.ftl это:Как вызвать общедоступную переменную Java в FreeMarker

${javaClass.getSomething(javaClass.VARIABLE)} 

и если класс JavaClass выглядит следующим образом:

public class JavaClass { 

    public static final int VARIABLE = 1; 

    public String getSomething(int var) { 
    ... 
    } 

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

[echo] Expression JavaClass is undefined on line 40, column 81 in com/test/template/path/test.ftl. [echo] The problematic instruction: [echo] ---------- [echo] 03:53:01,146 ERROR [main][runtime:96] Template processing error: "Expression JavaClass is undefined on line 40, column 81 in com/test/template/path/test.ftl" [echo] [echo] ==> ${javaClass.getSomething(javaClass.VARIABLE)} [on line 40, column 25 in com/test/template/path/test.ftl] Expression JavaClass is undefined on line 40, column 81 in com/test/template/path/test.ftl. [echo] [echo] ----------The problematic instruction: [echo] [echo] [echo] ---------- [echo] Java backtrace for programmers: [echo] ---------- [echo] ==> ${javaClass.getSomething(javaClass.VARIABLE)} [on line 40, column 25 in com/test/template/path/test.ftl]freemarker.core.InvalidRe ferenceException: Expression JavaClass is undefined on line 40, column 81 in com/test/template/path/test.ftl. ... ...

Эта ошибка в жалобах отсутствует, если не нравится javaClass.VARIABLE и ws InvalidReferenceException. Я попытался указать это другими способами, например JavaClass.VARIABLE, ${javaClass.VARIABLE} и ${JavaClass.VARIABLE}, но все они бросают ошибки.

Как вы могли бы назвать общедоступную переменную Java из метода Java в шаблоне FreeMarker (.ftl)?

ответ

2

Модель данных Freemarker не отображает статические поля в объектах, переданных автоматически, поэтому вам нужно будет использовать beanwrapper http://freemarker.org/docs/pgui_misc_beanwrapper.html.

import freemarker.ext.beans.BeansWrapper; 

BeansWrapper w = new BeansWrapper(); 
TemplateHashModel statics = w.getStaticModels(); 
model.addAttribute("myVariable", statics); 

затем в шаблоне, используйте

${myVariable["fully.qualified.package.ClassName"].FIELD_NAME} 
+0

Это лучше использовать 'ObjectWrapper', используемый в' Configuration', предполагая, что это 'BeansWrapper' подкласс (как' DefaultObjectWrapper'). – ddekany

+1

Также, вероятно, лучше сделать 'model.addAttribute (« ClassName », statics.get (ClassName.class.getName())), поэтому в шаблоне вы можете просто написать' $ {ClassName.FIELD_NAME} '. – ddekany

+0

Да, справедливо - создание ключа имя класса, а затем добавление модели для этого класса индивидуально, вероятно, приятнее. – Chii