freemarker 版本
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
代码:
import com.google.common.collect.Maps; import freemarker.cache.StringTemplateLoader; import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.SimpleDate; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; import java.io.StringWriter; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.util.Map; import java.util.Objects; public class FreeMarkerUtils { private FreeMarkerUtils() { } public static String parseString(String template, String key, String value) { Map<String, Object> param = Maps.newHashMap(); param.put(key, value); return FreeMarkerUtils.parseString(template, param); } public static String parseString(String template, Object[][] array) { Map<String, Object> param = Maps.newHashMap(); for (Object[] item : array) { param.put(Objects.toString(item[0]), item[1]); } return FreeMarkerUtils.parseString(template, param); } public static String parseString(String template, Object param) { try { Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS); cfg.setObjectWrapper(new CustomObjectWrapper()); cfg.setNumberFormat("#"); StringTemplateLoader templateLoader = new StringTemplateLoader(); templateLoader.putTemplate("template", template); cfg.setTemplateLoader(templateLoader); StringWriter out = new StringWriter(); cfg.getTemplate("template").process(param, out); return out.toString(); } catch (Exception e) { throw new RuntimeException(e); } } private static class CustomObjectWrapper extends DefaultObjectWrapper { @Override public TemplateModel wrap(Object obj) throws TemplateModelException { if (obj instanceof LocalDateTime) { Timestamp timestamp = Timestamp.valueOf((LocalDateTime) obj); return new SimpleDate(timestamp); } if (obj instanceof LocalDate) { Date date = Date.valueOf((LocalDate) obj); return new SimpleDate(date); } if (obj instanceof LocalTime) { Time time = Time.valueOf((LocalTime) obj); return new SimpleDate(time); } if (obj instanceof Instant) { LocalDateTime localTime = LocalDateTime.ofInstant((Instant) obj, ZoneId.systemDefault()); Timestamp time = Timestamp.valueOf(localTime); return new SimpleDate(time); } return super.wrap(obj); } } }