我想从FreeMarker Template
访问静态属性我有一个类说Global包含静态最终字段,这个类不属于 FreeMarker模型。我想知道是否有办法将此类添加到FreeMarker模型 在启动我的应用程序并从Freemarker模板访问时:
${statics["com.ums.common.Global"].Change}
答案 0 :(得分:0)
尝试
dataModel.put("statics", ((BeansWrapper) cfg.getObjectWrapper()).getStaticModels());
其中cfg
是FreeMarker Configuration
对象。然后,您可以使用statics['com.example.ClassName'].FIELD_NAME
来访问静态字段或方法。你也可以使用像
dataModel.put("globals", ((BeansWrapper) cfg.getObjectWrapper()).getStaticModels().get("com.ums.common.Global"));
如果您只想公开该类的常量。
答案 1 :(得分:0)
您可以创建 Spring 配置类来配置 Freemarker,并使用 Freemarker configuration.setSharedVariables()
方法启用从任何模板访问静态方法。共享变量对于放置全局属性(例如来自您的 application.yaml
文件)也非常有用,因此它们可以从任何模板全局可用。
@Configuration
public class FreemarkerConfig implements BeanPostProcessor {
@Value("${email.from-address}") // e.g. from `application.yaml`
private String emailFromAddress;
@SneakyThrows // or use try / catch (if not using lombok)
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof FreeMarkerConfigurer) {
FreeMarkerConfigurer configurer = (FreeMarkerConfigurer) bean;
freemarker.template.Configuration configuration = configurer.getConfiguration();
BeansWrapper objectWrapper = (BeansWrapper) configuration.getObjectWrapper();
configuration.setSharedVariables(getSharedVariables(objectWrapper));
}
return bean;
}
private Map<String, ?> getSharedVariables(BeansWrapper config) {
Map<String, Object> sharedVariables = new HashMap<>();
// Add global variables
sharedVariables.put("emailFromAddress", emailFromAddress);
// Add static support
TemplateModel statics = config.getStaticModels();
sharedVariables.put("statics", statics);
return sharedVariables;
}
}
设置好配置后,您可以在任何模板(例如 ${emailFromAddress}
)中添加访问您的共享变量。
要访问静态方法,您首先需要链接包含静态方法的类。例如,如果您想对 2 个对象进行更定制的比较,您可能有:-
public class FreemarkerUtils {
/**
* Compare 2 objects. Both objects are converted to Strings first of all (empty String if null) and compared.
*/
public static boolean isEqualTo(Object obj1, Object obj2) {
String str1 = obj1 != null ? String.valueOf(obj1) : "";
String str2 = obj2 != null ? String.valueOf(obj2) : "";
return str1.equals(str2);
}
}
必须在 freemarker 模板中按如下方式分配此静态方法...
<#assign Util=statics['com.my.package.FreemarkerUtils']>
... 使用如下...
<#if Util.isEqualTo (obj1, obj2)> objects are equal! </#if>
当 Freemarker 对您的特定用例不够强大时,从模板中使用这样的 Java 静态方法会很有用。