Ресурсы

Интерфейс io.jmix.core.Resources является центральным инфраструктурным API для загрузки ресурсов из различных мест.

Он полезен, когда код приложения или конфигурация фреймворка должны загружать файлы, которые могут быть предоставлены либо из classpath, либо из внешнего каталога конфигурации.

Расположение ресурсов

Resources выполняет поиск ресурса в соответствии со следующими правилами:

  1. Если расположение является URL-адресом, ресурс загружается по этому URL-адресу.

  2. Если расположение начинается с префикса classpath:, ресурс загружается из classpath.

  3. Если расположение не является URL-адресом и не начинается с classpath:, Jmix сначала выполняет поиск файла в каталоге, указанном свойством приложения jmix.core.conf-dir, используя предоставленное расположение как относительный путь.

  4. Если файл не найден в каталоге конфигурации, Jmix выполняет поиск в classpath.

На практике ресурсы обычно загружаются либо из внешнего каталога конфигурации, либо из classpath. Файл в каталоге конфигурации переопределяет ресурс classpath с тем же расположением.

Загрузка ресурсов

Инжектируйте Resources:

@Autowired
private Resources resources;

Используйте getResourceAsStream(), чтобы получить InputStream для ресурса. Метод возвращает null, если ресурс не найден. Закройте поток после использования:

@Autowired
private Resources resources;

@Subscribe
public void onInit(final InitEvent event) {
    try (InputStream stream = resources.getResourceAsStream(SRC_PATH)) {
        if (stream == null) {
            // resource not found
            return;
        }
        // use the stream
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

Используйте getResourceAsString(), чтобы загрузить содержимое ресурса как строку в кодировке UTF-8. Метод возвращает null, если ресурс не найден:

String content = resources.getResourceAsString("com/company/demo/sample.txt");

Получение Spring Resource

Поскольку Resources расширяет Spring ResourceLoader, вы также можете использовать getResource(), когда вам нужен объект org.springframework.core.io.Resource:

Resource resource = resources.getResource("classpath:com/company/demo/sample.txt");