Freemarker - доступ к статическим переменным объекта - PullRequest
4 голосов
/ 12 марта 2012

У меня есть простой класс:

public class MyClass {

     public final static long MAIN = 1;

     @Setter @Getter
     protected int id;
}

(@Setter @Getter - это lombok аннотации для методов Setter и Getter.)

В шаблоне Freemarker я хотел бысоздайте условие вроде:

<#if myClassInstance.id == myClassInstance.MAIN>

Но правая часть выражения if в соответствии с FreeMarker не определена.Есть ли способ сделать это?Спасибо!

Ответы [ 4 ]

2 голосов
/ 18 января 2017

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

Используйте приведенный ниже фрагмент кода в java

BeansWrapper w = new BeansWrapper(); 
TemplateModel statics = w.getStaticModels(); 
map.put("statics", statics); // map is java.util.Map
template.process(map, out); // template is freemarker.template.Template

Тогда постоянная доступа в ftl

${statics["com.model.to.gen.Common"].FLAG_YES} 

здесь com.model.to.gen.Common является классом и FLAG_YES является статической константой.

2 голосов
/ 12 марта 2012

Язык шаблонов не знает о классах Java.Но вы можете выставить статические члены через модель данных (контекст шаблона).Смотри: http://freemarker.org/docs/pgui_misc_beanwrapper.html#autoid_55

0 голосов
/ 01 августа 2018

У меня есть другой похожий, но эффективный способ.Во-первых, мы можем создать класс утилит следующим образом:

/**
 * FreeMarker Utils.
 *
 * @author Eric Chan
 */
public abstract class FreeMarkerUtils {

    /**
     * init for static classes and fields.
     *
     * @param model model
     */
    public static void initStatics(final Model model) {
        // you can also create the Version like: new Version("2.3.27");
        BeansWrapper wrapper = new BeansWrapper(new Version(2, 3, 27));
        TemplateModel statics = wrapper.getStaticModels();
        model.addAttribute("statics", statics);
    }

}

И затем, вызвать его в вашем Controller:

FreeMarkerUtils.initStatics(model);

Вот и все, теперь вы можете получить доступ к статическим переменным вваш .ftl вот так:

${statics["com.springboot.constants.TestConstants"].NAME}
0 голосов
/ 03 апреля 2017

Вы можете использовать выставить поля опция. Таким образом, вы можете использовать модели данных без аксессоров (получателей / установщиков).

BeansWrapperBuilder wrapperBuilder = new BeansWrapperBuilder(Configuration.VERSION_2_3_23);
wrapperBuilder.setExposeFields(true);

Template     template     = freemarkerConfiguration.getTemplate("mytemplatefile.ftl");
StringWriter stringWriter = new StringWriter();

template.process(model, stringWriter, wrapperBuilder.build());

System.out.println(stringWriter.toString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...