2012-03-11 4 views
4

У меня есть простой класс:Freemarker - доступ статические переменные объекта

public class MyClass { 

    public final static long MAIN = 1; 

    @Setter @Getter 
    protected int id; 
} 

(. @Setter@Getter являются lombok аннотации и присваивателя методов)

В шаблоне Freemarker Я хотел бы создать состояние как:

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

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

ответ

2

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

+0

Спасибо, что я уже видел. Я не понимаю, почему статические объекты класса не обертываются экземпляром? Я не пытался MyClass.MAIN, но myClassInstance.MAIN. –

+1

Возможно, это просто не случилось с автором «BeansWrapper» тогда ... Но, я думаю, это не было бы реальным решением проблемы в любом случае, потому что иногда вы хотите получить доступ к статическим членам, когда нет экземпляра вокруг , Что-то вроде '' com.example.MyClass '? Statics' было бы более уместным (хотя оно требует еще одной настройки безопасности на основе класса - '? New' уже имеет один). – ddekany

2

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

Используйте ниже фрагмент кода в 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 - статическая константа.

0

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

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()); 
Смежные вопросы