Неправильное разрешение ресурса / пути EAR для Wildfly в модуле EJB JAR - PullRequest
0 голосов
/ 08 мая 2019

Среда:

  • 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 равно точно так же .

...