Обслуживание Статические ресурсы из файловой системы | Spring Загрузочный Web

Используя веб-приложение Spring Boot, я пытаюсь выполнить статический ресурс из папки файловой системы вне моего проекта.

Структура папки выглядит так: -

          src
             main
                 java
                 resources
             test
                 java
                 resources
          pom.xml
          ext-resources   (I want to keep my static resources here)
                 test.js

Spring Конфигурация: -

@SpringBootApplication
public class DemoStaticresourceApplication extends WebMvcConfigurerAdapter {

    public static void main(String[] args) {
        SpringApplication.run(DemoStaticresourceApplication.class, args);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/test/**").addResourceLocations("file:///./ext-resources/")
                .setCachePeriod(0);
    }
}

Нажатие http://localhost:9999/test/test.js 'в моем браузере возвращает 404.

Как мне настроить ResourceHandlerRegistry для обслуживания статических ресурсов из вышеупомянутой папки "ext-resources"?

Я могу включить/выключить кеш для среды dev/prod.

Спасибо

ОБНОВЛЕНИЕ 1

Дает абсолютный путь к файлу: -

@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/test/**")
                .addResourceLocations(
                        "file:///C:/Sambhav/Installations/workspace/demo-staticresource/ext-resources/")
                .setCachePeriod(0);
}

Как я могу предоставить относительное местоположение? Абсолютный путь сделает мою жизнь жесткой во время процесса сборки и развертывания.

Ответ 1

file:/// - абсолютный URL-адрес, указывающий на корень файловой системы, и поэтому file:///./ext-resources/ означает, что Spring Boot ищет ресурсы в каталоге с именем ext-resources в корневом каталоге.

Обновите свою конфигурацию, чтобы использовать что-то вроде file:ext-resources/ в качестве URL-адреса.

Ответ 2

Spring Управление конфигурацией загрузки позволяет использовать несколько стратегий (см. справочную документацию по загрузке).

При использовании статического, полный путь работает здесь, я бы посоветовал вам не использовать эту стратегию, поскольку каждый разработчик в вашей команде не будет использовать один и тот же макет рабочей области.

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

Как только это свойство, скажем resources.projectroot, несколько способов установить это:

  • каждый разработчик вручную устанавливает это значение в свой файл application.yml или application.properties
  • используйте переменные env при запуске проекта, например RESOURCES_PROJECTROOT=/home/user/demo/ ./gradlew bootRun (здесь, gradle + unix) или set RESOURCES_PROJECTROOT=%cd% mvn spring-boot:run (здесь, maven + windows)

Вероятно, вы найдете множество других решений, соответствующих вашим потребностям, взглянув на ваш инструмент сборки, вашу операционную систему и все стратегии конфигурации, которые предоставляет Boot.

Ответ 3

Spring Загрузочный модуль Maven может добавлять дополнительные каталоги в путь к классам. В вашем случае вы можете включить это в свой pom.

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>${spring.boot.version}</version>
    <configuration>
        <folders>
            <folder>${project.build.directory}/../ext-resources</folder>
        </folders>

        ...
    </configuration>
</plugin>

Таким образом, вам не нужно вставлять какой-либо жесткий код в свои классы. Просто запустите свой webapp с помощью

mvn spring-boot:run

Ответ 4

Это то, что я сделал в классе WebConfig, внутри метода addResourceHandlers:

boolean devMode = this.env.acceptsProfiles("development");
String location;
if (devMode) {
    String currentPath = new File(".").getAbsolutePath();
    location = "file:///" + currentPath + "/client/src/";
} else {
    location = "classpath:static/";
}