环境:
我们正在实现 Bean 用作免费标记模板提供程序。 Bean *。java 文件包含在 application-services-ejb JAR 模块的源文件夹中,打包在 application-services-ear EAR 模块中。
Bean 构造函数初始化 freemarker.template.Configuration 对象。之后,使用 Bean 的类可以调用 Bean.getCredentialCreationTemplate()方法,该方法从 Configuration获得所需的 Template 对象。
Configuration 对象需要将包含所有 *。ftl 文件的目录传递给 Configuration.setDirectoryForTemplateLoading(File)方法。
使用常规的 getResources()方法检索 FTL模板目录:
String emailTemplateFolderPath = getClass().getClassLoader().getResource("emails").getFile();
File emailTemplateFolder = new File(emailTemplateFolderPath);
奇怪的是: emailTemplateFolderPath 包含一个错误的路径: C:\ Users \ myusername \ Desktop \ content \ application-services-ear-VERSION.ear \ org.company-application-services-ejb-VERSION.jar \电子邮件
错误部分是粗体强调的部分。实际上, italic 中的部分与EAR中的预期路径和实际路径都匹配(我手动检查了档案)。相反,我不知道粗体部分从何而来。目录 C:\ Users \ myusername \ Desktop \ content 甚至在我的工作站上都不存在,也与EAR的实际位置都不相似,而该位置与EAR的路径完全不同。我的文件系统。
与我的桌面的唯一连接是我的 Wildfly启动脚本和应用程序重新部署脚本位于 C:\ Users \ myusername \ Desktop 中。
为什么类加载器无法正确定位EAR?我该如何解决?
这是我的代码:
@Stateless
public class FTLTemplateProviderImpl implements FTLTemplateProvider {
public enum FTLTemplate {
CREDENTIAL_CREATION("credential-creation.ftl");
private final String fileName;
private FTLTemplate(String fileName) {
this.fileName = fileName;
}
public String getFileName() {
return this.fileName;
}
}
private Configuration cfg = null;
public FTLTemplateProviderImpl() {
try {
cfg = new Configuration(Configuration.VERSION_2_3_28);
String emailTemplateFolderPath = getClass().getClassLoader().getResource("emails").getFile();
File emailTemplateFolder = new File(emailTemplateFolderPath);
cfg.setDirectoryForTemplateLoading(emailTemplateFolder); // <-- HERE IT BREAKS!
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
cfg.setLogTemplateExceptions(false);
cfg.setWrapUncheckedExceptions(true);
cfg.setTemplateLoader(new FileTemplateLoader(emailTemplateFolder));
} catch (IOException ex) {
throw new RuntimeException(ex.getMessage(), ex);
}
}
@PermitAll
@Override
public Template getCredentialCreationTemplate() {
try {
return cfg.getTemplate(FTLTemplate.CREDENTIAL_CREATION.getFileName());
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
请考虑到我们还尝试了将@Stateless bean转换为@Singleton ,并进行了所有必要的调整,以使其可加载和可注入客户端bean。尽管如此, emailTemplateFolderPath 的内容完全相同。