Весенний ресурс classpath перезаписан - PullRequest
1 голос
/ 06 июня 2019

У меня есть класс, который использует следующий код:

@Value(value = "classpath:mail_template.html")
private Resource template;

В соответствии с этим руководством, это позволит мне получать данные из файла внутри моего jar-файла, используя template.getInputStream(),Это работало корректно, пока еще один mail_template.html не был добавлен в другой модуль.

Мое приложение имеет main_application, у которого POM использует другие модули в качестве зависимостей.Структура выглядит следующим образом:

main_application
    |
    - modulue_1 (another module)
        |
        - src/main/java
        - src/main/resources
            |
            - mail_template.html
    - modulue_2 (my module)
        |
        - src/main/java
        - src/main/resources
            |
            - mail_template.html

Так что теперь мой класс использует mail_template.html модуля_1 вместо того, который есть у меня внутри моего модуля.Как я понимаю, это правильное поведение, так как module_1 загружается первым, а @Value вводится с первым найденным им mail_template.html, но это не будет правильным в моем случае, поскольку он переопределяет ресурс в module_2 (и последующих модулях какхорошо) с тем же именем в module_1.

Можно ли указать использование текущего класса (или модуля) для поиска ресурса в каталоге src/main/resources в аннотации @Value?Или я должен уникально назвать каждый ресурс в каждом модуле, чтобы избежать этой проблемы?

Я пробовал много разных маршрутов "classpath:", включая:

@Value(value = "classpath:module_2/mail_template.html")
....
@Value(value = "classpath*:mail_template.html")
...
@Value(value = "classpath*:module_2/mail_template.html")

Но все это приводит к FileNotFoundException.

РЕДАКТИРОВАТЬ

Каждый модуль состоит из следующих элементов:

Maven POM Project
    Maven Java Application
        src/main/java
            base.package.with.module.name.as.suffix.package
        src/main/resources
            resource_files_if_needed

Как указано, каждый модуль объявляется как зависимость в Java-приложении Maven main_applicationи каждое приложение Java Maven использует «базовый пакет» с именем модуля в качестве суффикса.

Например:

// main_application:
    package my.main.application
// module_1:
    package my.main.application.module1
// module_2:
    package my.main.application.module2

Это используется, чтобы Spring мог загружать классы с помощью @Componentаннотации с использованием <context:component-scan base-package="my.main.application" /> в файле конфигурации.

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Я верю, это фактически пропускает classpath в выражении @Value. Я думаю, что проблема : после classpath. : в @Value относится к символу разделителя для разделения ключа свойства и значения по умолчанию. Например, приведенный ниже код ищет ключ project.123.gender и, если он недоступен, возвращает Male по умолчанию.

@Value("${project.123.gender:Male}")

Не могли бы вы попробовать что-то вроде ниже? Я не проверял это, но похоже, что это может быть одной из возможных проблем. (обратите внимание на дополнительные : в начале)

@Value(value = ":classpath:mail_template.html")

OR

@Value(value = "${:classpath:mail_template.html"})

0 голосов
/ 06 июня 2019

У вас может быть только один mail_template.html в пути к классам. Это также верно для классов с одинаковым пакетом и именем класса.

Я бы предложил нам другое имя каталога в каталоге ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...