昨天改完CheckDomain的bug后,打包jar准备部署到服务器上,本地测试都正常,但是扔到服务器上却发不了邮件了...
经过多次测试发现,freemarker在jar包中无法使用类加载器获取resourse目录下的templates文件
出现的问题代码如下:(本地测试正常,打包jar后无法获取模板)
/**
* 邮件模板静态化
*
* @param mailTemplateModel 模板数据模型
* @return 加上数据后的静态化模板
*/
@Override
public String getMailHtml(MailTemplateModel mailTemplateModel) {
try {
//创建配置类
Configuration configuration = new Configuration(Configuration.getVersion());
//设置模板路径
String classpath = this.getClass().getResource("/").getPath();
configuration.setDirectoryForTemplateLoading(new File(classpath + "/templates"));
//设置字符集
configuration.setDefaultEncoding("utf-8");
//加载模板
Template template = configuration.getTemplate("mailTemplate.ftl");
//模板静态化并返回
return FreeMarkerTemplateUtils.processTemplateIntoString(template, mailTemplateModel);
} catch (Exception e) {
e.printStackTrace();
log.error("模板静态化异常", e);
return null;
}
}
修改后的代码:(打包jar后正常获取模板)
@Autowired
FreeMarkerConfigurer freeMarkerConfigurer;
/**
* 邮件模板静态化
*
* @param mailTemplateModel 模板数据模型
* @return 加上数据后的静态化模板
*/
@Override
public String getMailHtml(MailTemplateModel mailTemplateModel) {
try {
//创建配置类
Configuration configuration = new Configuration(Configuration.getVersion());
//设置模板路径
//String classpath = this.getClass().getResource("/").getPath();
//configuration.setDirectoryForTemplateLoading(new File(classpath + "/templates"));
//设置字符集
configuration.setDefaultEncoding("utf-8");
//加载模板
//Template template = configuration.getTemplate("mailTemplate.ftl");
Template template = freeMarkerConfigurer.getConfiguration().getTemplate("mailTemplate.ftl");
//模板静态化并返回
return FreeMarkerTemplateUtils.processTemplateIntoString(template, mailTemplateModel);
} catch (Exception e) {
e.printStackTrace();
log.error("模板静态化异常", e);
return null;
}
}
PS: .ftl模板文件放在 templates 目录下
总结:freemarker无法使用类加载器获取jar包中的resourse目录下的templates文件
解决办法:注入FreeMarkerConfigurer
配置类,因为freemarker模板的默认目录就在resourse下的templates目录下,
使用freeMarkerConfigurer.getConfiguration().getTemplate("mailTemplate.ftl")
可直接获取到对应的模板文件