У меня тоже была такая потребность, но я не хотел использовать ObjectConstructor
FreeMarker (на мой вкус это было слишком похоже на скриптлет).
Я написал пользовательский FileTemplateLoader :
public class CustomFileTemplateLoader
extends FileTemplateLoader {
private static final String STUB_FTL = "/tools/empty.ftl";
public CustomFileTemplateLoader(File baseDir) throws IOException {
super(baseDir);
}
@Override
public Object findTemplateSource(String name) throws IOException {
Object result = null;
if (name.startsWith("optional:")) {
result = super.findTemplateSource(name.replace("optional:", ""));
if (result == null) {
result = super.findTemplateSource(STUB_FTL);
}
}
if (result == null) {
result = super.findTemplateSource(name);
}
return result;
}
}
И мой соответствующий макрос FreeMarker:
<#macro optional_include name>
<#include "/optional:" + name>
</#macro>
Требуется пустой файл FTL (/tools/empty.ftl
), который просто содержит комментарий, объясняющий его существование.
В результате «необязательное» включение просто включает этот пустой FTL, если запрошенный FTL не может быть найден.