Среда:
- AS: Wildfly-16.0.0. Финал
- JVM: jdk-11.0.2
Мы реализуем Bean для использования в качестве бесплатного маркера Template провайдера.Файл Bean *. Java содержится в исходной папке модуля application-services-ejb JAR , который упакован вмодуль application-services-ear EAR .
Конструктор Bean инициализирует объект freemarker.template.Configuration ,После этого класс, который использует Bean , может вызывать метод Bean.getCredentialCreationTemplate () , который получает требуемый Template из Configuration object.
Объект Configuration требует, чтобы каталог, содержащий все файлы *. ftl , был передан в Configuration.setDirectoryForTemplateLoading (File) method.
Каталог шаблонов FTL извлекается с помощью обычного getResources () подхода:
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 \ emails
Неправильный элемент, выделенный жирным шрифтом .Действительно, часть в курсив соответствует как ожидаемому, так и фактическому пути в EAR (я проверил архив вручную).Вместо этого я понятия не имею, откуда взята жирная часть.Каталог C: \ Users \ myusername \ Desktop \ content даже не существует на моей рабочей станции , также он не похож на фактическое местоположение 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 в @ Singleton ,сделать все необходимые настройки, чтобы сделать его загружаемым и вводимым в клиентский компонент.Несмотря на это, содержимое emailTemplateFolderPath равно точно так же .