Freemarker:方便的生成UUID

Freemarker: generate UUID conveniently

似乎没有方便的内置 Freemarker 来在模板中生成随机 UUID。

我能想到的最好办法是创建一个 Freemarker method;在我的 Java 8 代码中,我在模板中注入了供以后使用的方法。示例:

public String generate(Map<String, Object> data, String templateLocation) throws IOException, TemplateException {
    try (StringWriter writer = new StringWriter()) {
        Template template = configuration.getTemplate(templateLocation);
        // UUID generation method injected in this line:
        data.put("uuid", (TemplateMethodModelEx) (list) -> UUID.randomUUID());
        template.process(data, writer);
        return writer.toString();
    }
}

在 Freemarker 模板中,我可以使用如下方法:

${uuid()}

在Freemarker中生成uuid有没有更方便的方案?

这是我的 Maven 依赖项:

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.25-incubating</version>
    <scope>test</scope>
</dependency>

您可以使用 statics 在您的模板中调用 randomUUID

${statics["java.util.UUID"].randomUUID()} 

This object exposes just about any class' static methods if it's used as a hash with class name as the key.

您可以使用 Configuration.setSharedVariable(...) 将该方法添加到全局配置中。

你可以像这样在配置 freemarker 上设置 UUID.randomUUID() 的值

public freemarker.template.Configuration configuration() throws TemplateModelException {
        freemarker.template.Configuration cfg = new freemarker.template.Configuration(freemarker.template.Configuration.VERSION_2_3_24);

        cfg.setDirectoryForTemplateLoading(new File("path/of/freemarker/template"));
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        cfg.setLogTemplateExceptions(false);
        cfg.setSharedVariable("UUID", UUID.randomUUID());

        return cfg;
    }

在模板中你可以使用这个

"var":"${UUID}"

注意:您可以在配置 freemarker 和模板时将“UUID”更改为其他值。