EJB JAR模块内的Wildfly上错误的资源/ EAR路径解析

时间:2019-05-08 14:41:07

标签: java-ee ejb wildfly classloader postconstruct

环境:

  • AS:Wildfly-16.0.0.Final
  • JVM:jdk-11.0.2

我们正在实现 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 的内容完全相同

0 个答案:

没有答案