Spring Boot не обслуживает статический контент

173

Я не могу заставить мой проект Spring-boot обслуживать статический контент.

Я поместил папку с именем staticпод src/main/resources. Внутри него есть папка с именем images. Когда я упаковываю приложение и запускаю его, оно не может найти изображения, которые я поместил в эту папку.

Я пытался поставить статические файлы public, resourcesи , META-INF/resourcesно ничего не работает.

Если я jar -tvf app.jar, я вижу, что файлы находятся внутри jar в правой папке: /static/images/head.pngнапример, но с вызовом: http://localhost:8080/images/head.pngвсе, что я получаю, это404

Есть идеи, почему Spring-Boot не находит это? (Я использую 1.1.4 BTW)

Виниций Карвалью
источник
6
Обработка ресурсов по умолчанию соответствует / **. Я бы дважды проверил, что он включен. Если это так, вы увидите строку, которая заканчивается «Отображенный путь URL [/ **] на обработчик типа [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]» в выводе при запуске приложения. Другой возможностью является собственный контроллер, который также сопоставлен с / ** и имеет приоритет над обработчиком ресурсов. Публикация результатов запуска вашего приложения поможет нам увидеть, что происходит.
Энди Уилкинсон
12
Я предполагаю, что у вас есть @EnableWebMvc(или эквивалент) в вашем приложении. Это отключило бы конфигурацию Boot MVC по умолчанию.
Дейв Сайер
1
Нет, у меня нигде нет @EnableWebMvc. Я не понимаю этого. Теперь это происходит и с шаблонами. Любой из моих шаблонов (freemarker) найден загрузчиком классов весенней загрузки.
Виниций Карвалью
2
Я сталкиваюсь с подобной проблемой, и мне не повезло ни с одним из рекомендуемых предоставленных решений. Если бы кто-то был так любезен, взглянуть и указать, что именно я делаю неправильно, это было бы очень признательно !!! github.com/kylebober/kbss
Кайл С. Бобер
3
Я обнаружил, что если у меня есть файл src / main / resources / public / style.css, то URL для этого - /style.css, а не /public/style.css, как я ожидал.
Дейв

Ответы:

179

Не воскрешать мертвых более чем через год, но во всех предыдущих ответах упущены некоторые важные моменты:

  1. @EnableWebMvcна вашем уроке отключат org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration. Это хорошо, если вы хотите полный контроль, но в противном случае это проблема.
  2. Нет необходимости писать какой-либо код, чтобы добавить другое место для статических ресурсов в дополнение к тому, что уже предоставлено. Глядя на org.springframework.boot.autoconfigure.web.ResourcePropertiesv1.3.0.RELEASE, я вижу поле, staticLocationsкоторое можно настроить в application.properties. Вот фрагмент из источника:

    /**
     * Locations of static resources. Defaults to classpath:[/META-INF/resources/,
     * /resources/, /static/, /public/] plus context:/ (the root of the servlet context).
     */
    private String[] staticLocations = RESOURCE_LOCATIONS;
  3. Как упоминалось ранее, URL запроса будет разрешен относительно этих мест. Таким образом src/main/resources/static/index.htmlбудет обслуживаться, когда запрос URL /index.html. Класс, который отвечает за разрешение пути, начиная с Spring 4.1, является org.springframework.web.servlet.resource.PathResourceResolver.

  4. Сопоставление с суффиксным шаблоном включено по умолчанию, что означает, что для URL-адреса запроса /index.htmlSpring будет искать соответствующие обработчики /index.html. Это проблема, если целью является предоставление статического контента. Чтобы отключить это, расширьте WebMvcConfigurerAdapter(но не используйте @EnableWebMvc) и переопределите, configurePathMatchкак показано ниже:

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        super.configurePathMatch(configurer);
    
        configurer.setUseSuffixPatternMatch(false);
    }

ИМХО, единственный способ уменьшить количество ошибок в вашем коде - это не писать код, когда это возможно. Используйте то, что уже предоставлено, даже если это потребует некоторых исследований, отдача того стоит.

Абхиджит Саркар
источник
3
этот ответ действительно после долгих исследований. Отличный человек для чтения
Эканш Растоги
2
Если бы я был ключевым, я бы взял этот ответ и поместил бы его в документацию Spring Boot
aliopi
2
@Abhijit Sarkar Я имел в виду компанию Pivotal , извините за любые плохие чувства, но это не было предназначено. Pivotal является владельцем Spring, если я прав. Я мог бы задокументировать это, но у них есть люди, которым платят за это, поэтому они должны это сделать: P
aliopi
1
@aliopi Spring - проект с открытым исходным кодом.
Абхиджит Саркар
3
единственный способ уменьшить количество ошибок в вашем коде - это не писать код [...] действительно так.
Клийстерс
78

В отличие от того, что говорится в Spring-Boot, чтобы заставить мой Spring-Boar-файл обслуживать контент: мне пришлось добавить специально зарегистрировать мой контент src / main / resources / static через этот класс конфигурации:

@Configuration
public class StaticResourceConfiguration implements WebMvcConfigurer {

    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
            "classpath:/META-INF/resources/", "classpath:/resources/",
            "classpath:/static/", "classpath:/public/" };

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
            .addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);
    }
}
Francois
источник
3
У меня та же проблема, та же версия Spring Boot, но у меня это тоже не сработало
greyfox
Исправлена ​​моя проблема в версии 1.2.5 !! большое спасибо .. проголосуйте за это !!
mrclrchtr
Этот хак работает ... странно, что автоконфигурация не удалась
Allan Vital
К сожалению, этот взлом не работает для меня, что является позором из-за элегантности. Я не уверен, является ли основная причина путями к ресурсу. Возможно, так как я запускаю его в Windows, они должны быть отформатированы по-другому?
acarlstein
50

У меня была похожая проблема, и оказалось, что простым решением было расширить класс конфигурации WebMvcAutoConfiguration:

@Configuration
@EnableWebMvc
@ComponentScan
public class ServerConfiguration extends WebMvcAutoConfiguration{
}

Мне не нужен был какой-либо другой код, который позволял бы обслуживать мой статический контент, однако я поместил каталог publicпод именем src/main/webappи настроил maven так, чтобы он указывал на src/main/webappкаталог ресурсов. Это означает, что publicон скопирован target/classesи, следовательно, находится в пути к классам во время выполнения для поиска spring-boot / tomcat.

Инженер-программист
источник
Таким образом, статические ресурсы не работают в других профилях. например у меня есть профиль для выпуска, который использует другой IP-адрес. Я получаю ошибку 404 для всех своих ресурсов.
Махди
24

Найдите контроллеры, сопоставленные с «/» или без пути.

У меня была такая проблема, я получил 405 ошибок и много дней бился головой. Проблемой оказался @RestControllerаннотированный контроллер, который я забыл аннотировать @RequestMappingаннотацией. Я предполагаю, что этот сопоставленный путь по умолчанию равен "/" и заблокировал статическое сопоставление ресурсов контента.

Johannes
источник
1
Решил это для меня! У меня был контроллер с аннотацией @RestController ("/ blubb"), что явно неправильно, но иногда вы не видите дрова для деревьев. Изменение на @RestController @RequestMapping ("/ blubb") решило это
krinklesaurus
Я рад, что это помогло, и удивлен тем, что выражение «Я не вижу леса для всех деревьев» существует как на немецком, так и на шведском языке :)
Йоханнес
2
Вы также можете явно добавить @RequestMapping ("/"), если намерение состоит в том, чтобы одновременно обслуживать статический контент и иметь динамический обработчик для корневых запросов.
mjj1409
1
Ух ты .... Потратил 2 потраченных впустую дня на этот. Мое весеннее загрузочное приложение mvc использует Spring Security и не видело файл styles.css. Я считаю, что безопасность не позволяла .jsp доступу к файлу styles.css. У меня был @RequestMapping ({"", "/", "/ home"}) в моем контроллере. Вынул "" и "/" и мой MVC начал работать отлично ... Очень странно.
Скмансфилд
3
@Shafiul Нет. Добавление EnableAutoConfiguration и SpringBootApplication является излишним! «@SpringBootApplication» содержит «@EnableAutoConfiguration»
Dehan de Croos
19

Конфигурация может быть выполнена следующим образом:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcAutoConfigurationAdapter {

// specific project configuration

}

Здесь важно то, что вы WebMvcConfig можете переопределить addResourceHandlersметод и, следовательно, вам нужно явно вызывать super.addResourceHandlers(registry)(это правда, что если вы удовлетворены расположением ресурсов по умолчанию, вам не нужно переопределять какой-либо метод).

Еще одна вещь , которая должна быть прокомментированы здесь в том , что эти места ресурсов по умолчанию ( /static, /public, /resourcesи /META-INF/resources) будут регистрироваться только при наличии уже не обработчик ресурсов сопоставляется с /**.

С этого момента, если у вас есть изображение, например, по src/main/resources/static/imagesимени image.jpg, вы можете получить к нему доступ, используя следующий URL: http://localhost:8080/images/image.jpg(сервер запущен на порту 8080 и приложение развернуто в корневом контексте).

Франсиско Спает
источник
Возможно, важно прокомментировать, что хотя вы можете / можете / переопределить addResourceHandlers, вам на самом деле это не нужно для решения проблемы OP.
инженер-программист,
@EngineerDollery спасибо за комментарий, это было мое намерение, но я явно добавил объяснение
Francisco Spaeth
Я переместил мои css / js в папку src / main / resources / static, и ошибок больше нет, но я все еще не могу заставить css отображаться на моей странице.
Хатем Джабер
Чувак, я путешествовал по Интернету, чтобы найти это рабочее решение. Кажется, ключом было сочетание @EnableWebMvcи WebMvcAutoConfigurationAdapter. Спасибо большое время!
Ян Ньюленд
У меня это тоже не получилось. Я должен был добавить это также. Я просто добавил свой комментарий здесь, потому что у меня было две проблемы. У меня также был контроллер, который отображал "/", как упоминает @Johannes. Выполнение этого и удаление моего контроллера "/" решило мои проблемы.
loyalBrown
11

Вы проверяли справочные документы Spring Boot ?

По умолчанию Spring Boot будет предоставлять статический контент из папки с именем /static(или /publicили /resourcesили /META-INF/resources) в пути к классам или из корня ServletContext.

Вы также можете сравнить свой проект с руководством по обслуживанию веб-контента в Spring MVC или проверить исходный код проекта spring-boot-sample-web-ui .

matsev
источник
2
Да, я пытался, это те места, которые я пробовал, как указано в документации. Но ничего не работает. Я не понимаю, почему ресурс вообще не найден. Я попытался посмотреть образцы, как ни странно, нет образца, который использует структуру, предложенную документами. Тот, который вы только что вставили, использует папку шаблонов, я предполагаю, что это для конфигурации или скорости тимелист.
Виниций Карвалью
Образец веб-интерфейса ( github.com/spring-projects/spring-boot/tree/v1.1.3.RELEASE/… ) обслуживает статическое содержимое.
Энди Уилкинсон
Я согласен с @ViniciusCarvalho, я перепробовал все возможные комбинации, чтобы получить css / js в нужном месте, и не могу этого сделать. Даже если я посещаю localhost: 8089 / css / styles.css, я ничего не вижу. У меня есть только одно правило, чтобы изменить цвет тела.
Хатем Джабер
10

У меня возникла именно эта проблема, затем я понял, что определил в своем application.properties:

spring.resources.static-locations=file:/var/www/static

Который отменял все остальное, что я пробовал. В моем случае я хотел оставить оба, поэтому я просто сохранил свойство и добавил:

spring.resources.static-locations=file:/var/www/static,classpath:static

Который обслуживал файлы из src / main / resources / static как localhost: {port} /file.html.

Ничто из вышеперечисленного не сработало для меня, потому что никто не упомянул об этом небольшом свойстве, которое можно было легко скопировать из Интернета для другой цели;)

Надеюсь, поможет! Я подумал, что это будет хорошо в этом длинном посте ответов для людей с этой проблемой.

С. Джейкоб Пауэлл
источник
Я использую Spring Boot 2.0.5.RELEASE и добавляю spring.resources.static-locations=file:/var/www/static,classpath:staticв мои application.properties, но у меня это не сработало. Я использую @EnableWebMvcна своем классе конфигурации.
Н. Нго,
Это был тот, который решил мою проблему. наряду с security.ignoredиsecurity.publicPaths
JoSSte
5

Я думаю, что предыдущие ответы очень хорошо относятся к теме. Тем не менее, я бы добавил, что в одном случае, когда в вашем приложении включена Spring Security, вам, возможно, придется специально указать Spring, чтобы он разрешал запросы к другим каталогам статических ресурсов, например, "/ static / fonts" .

В моем случае у меня были "/ static / css", "/ static / js", "/ static / images" по умолчанию, но / static / fonts / ** была заблокирована моей реализацией Spring Security.

Ниже приведен пример того, как я это исправил.

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
.....
    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/", "/fonts/**").permitAll().
        //other security configuration rules
    }
.....
}
RemusS
источник
5

Просто чтобы добавить еще один ответ на старый вопрос ... Люди упоминали, что @EnableWebMvcбудет предотвращать WebMvcAutoConfigurationзагрузку, то есть код, отвечающий за создание обработчиков статических ресурсов. Есть и другие условия, которые также будут препятствовать WebMvcAutoConfigurationзагрузке. Самый простой способ увидеть это - посмотреть на источник:

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/ WebMvcAutoConfiguration.java # L139-L141

В моем случае я включал библиотеку, у которой был класс, который расширяется, WebMvcConfigurationSupportи это условие, которое предотвратит автоконфигурацию:

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

Важно никогда не расширяться WebMvcConfigurationSupport. Вместо этого простирайтесь от WebMvcConfigurerAdapter.

ОБНОВЛЕНИЕ: правильный способ сделать это в 5.x - реализовать WebMvcConfigurer

Bal
источник
Начиная с версии Spring Boot 5.0 WebMvcConfigurerAdapter устарел. Поиск в Google показывает это в Javadocs для этого класса: «начиная с 5.0 WebMvcConfigurer имеет методы по умолчанию (стало возможным благодаря базовой версии Java 8) и может быть реализован напрямую без использования этого адаптера». Поэтому я думаю, что сейчас реализуется WebMvcConfigurer.
Марво
@ Марво это совершенно верно. Правильный способ сделать это в 5.x - реализовать WebMvcConfigurer.
Бал
4

Это решение работает для меня:

Сначала поместите папку ресурсов в webapp / WEB-INF, как указано в структуре

-- src
  -- main
    -- webapp
      -- WEB-INF
        -- resources
          -- css
          -- image
          -- js
          -- ...

Во-вторых, весной конфигурационный файл

@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter{

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".html");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resource/**").addResourceLocations("WEB-INF/resources/");
    }
}

Затем вы можете получить доступ к содержимому вашего ресурса, например, http: // localhost: 8080 / resource / image / yourimage.jpg

ldeng
источник
3

Есть две вещи, которые следует учитывать (Spring Boot v1.5.2.RELEASE): 1) Проверить все классы контроллера для аннотации @EnableWebMvc, удалить ее, если есть 2) Проверить классы контроллера, для которых используется аннотация - @RestController или @Controller , Не смешивайте Rest API и поведение MVC в одном классе. Для MVC используйте @Controller, а для REST API используйте @RestController

Выполнение 2-х вещей решило мою проблему. Теперь моя весенняя загрузка загружает статические ресурсы без каких-либо проблем. @Controller => load index.html => загружает статические файлы.

@Controller
public class WelcomeController {

    // inject via application.properties
    @Value("${welcome.message:Hello}")
    private String message = "Hello World";

    @RequestMapping("/")
    public String home(Map<String, Object> model) {
        model.put("message", this.message);
        return "index";
    }

}

index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>index</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


    <link rel="stylesheet/less" th:href="@{/webapp/assets/theme.siberia.less}"/>

    <!-- The app's logic -->
    <script type="text/javascript" data-main="/webapp/app" th:src="@{/webapp/libs/require.js}"></script>
    <script type="text/javascript">
        require.config({
            paths: { text:"/webapp/libs/text" }
        });
    </script>



   <!-- Development only -->
     <script type="text/javascript" th:src="@{/webapp/libs/less.min.js}"></script>


</head>
<body>

</body>
</html>
GJP
источник
Удаление @EnableWebMvc сделало это для меня! Спасибо
турбоему
3

Поместите статические ресурсы в каталог:

/src/main/resources/static

добавить это свойство в файл application.properties

server.servlet.context-path=/pdx

Вы можете получить доступ с http: // localhost: 8080 / pdx / images / image.jpg

введите описание изображения здесь

dasunse
источник
1
Я не знаю, как сказать Спасибо тебе. Брат, ты великолепен. Я испробовал почти все решения выше, но это лучшее и самое короткое.
user12061795
2

Если проблема возникает при запуске приложения из среды IDE (т.е. начиная с Eclipse или IntelliJ Idea) и с использованием Maven, ключом к решению является документация Spring-boot Getting Started :

Если вы используете Maven, выполните:

mvn package && java -jar target/gs-spring-boot-0.1.0.jar

Важной частью является добавление packageцели, которая будет запущена до фактического запуска приложения. (Идея: Runменю Edit Configrations..., Addи там выберите Run Maven Goalи укажите packageцель в поле)

ppeterka
источник
1

Я использую 1.3.5 и размещаю кучу REST-сервисов через реализацию на Джерси. Это работало нормально, пока я не решил добавить пару файлов HTMLs + js. Ни один из ответов на этом форуме не помог мне. Однако, когда я добавил следующую зависимость в свой pom.xml, все содержимое в src / main / resources / static наконец показывалось через браузер:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<dependency>

Кажется, что spring-web / spring-webmvc является важной транзитивной зависимостью, которая позволяет включить автоматическую настройку весенней загрузки.

LilleElefant
источник
1

К вашему сведению: я также заметил, что могу испортить отлично работающее приложение с весенней загрузкой и запретить ему показывать содержимое из статической папки, если я добавлю контроллер плохого отдыха, например, так

 @RestController
public class BadController {
    @RequestMapping(method= RequestMethod.POST)
    public String someMethod(@RequestParam(value="date", required=false)String dateString, Model model){
        return "foo";
    }
}

В этом примере после добавления плохого контроллера в проект, когда браузер запрашивает файл, доступный в статической папке, ответом на ошибку является « 405 Method Not Allowed ».

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

Ganesh
источник
1

Я столкнулся с той же проблемой в весенней загрузке 2.1.3, говоря, что ресурс не найден 404. Я удалил ниже из applicationatiion.properties .

#spring.resources.add-mappings=true
#spring.resources.static-locations=classpath:static
#spring.mvc.static-path-pattern=/**,

Удалил @enableWebMVC и удалил все переопределения WebMvcConfigurer

// @ EnableWebMvc

Также убедитесь, что у вас есть @EnableAutoConfiguration в вашей конфигурации.

И поместите все статические ресурсы в src / main / resources / static, и это, наконец, сработало как волшебство ..

Debadatta
источник
моя весенняя версия в 2.2.6, и у меня есть @EnableAutoConfiguration и файлы в src / main / resources / static, но он не работает и выдает 500.
Shivani Thakur
1

используя весеннюю загрузку 2. *, у меня есть контроллер, который отображается на маршруты GetMapping({"/{var}", "/{var1}/{var2}", "/{var1}/{var2}/{var3}"})и бум, мое приложение перестает обслуживать ресурсы.

я знаю, что не рекомендуется иметь такие маршруты, но все зависит от приложения, которое вы создаете (в моем случае, у меня нет выбора, кроме как иметь такие маршруты)

так вот мой взлом, чтобы убедиться, что мое приложение снова обслуживает ресурсы. У меня просто есть контроллер, который отображается на мои ресурсы. так как весна сначала будет соответствовать прямому маршруту перед тем, у которого есть переменная, я решил добавить метод контроллера, который сопоставляется /imgaes/{name}и повторяется для других ресурсов

@GetMapping(value = "/images/{image}", produces = {MediaType.IMAGE_GIF_VALUE, MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
    public @ResponseBody
    byte[] getImage(@PathVariable String image) {
        ClassPathResource file = new ClassPathResource("static/images/" + image);
        byte[] bytes;
        try {
            bytes = StreamUtils.copyToByteArray(file.getInputStream());
        } catch (IOException e) {
            throw new ResourceNotFoundException("file not found: " + image);
        }
        return bytes;
    }

и это решило мою проблему

Рейнс
источник
0

Возникла такая же проблема, используя gradle и eclipse, и часами пытался ее выяснить.

Кодирование не требуется, уловка в том, что вы должны использовать пункт меню New-> Source Folder (NOT New -> Folder), чтобы создать статическую папку в src / main / resources. Не знаю, почему это работает, но сделал новую -> исходную папку, затем я назвал папку статической (тогда в диалоговом окне с исходной папкой выдается сообщение об ошибке, для которого необходимо проверить: обновить фильтры исключений в других исходных папках, чтобы разрешить вложение). В мою новую статическую папку я добавил index.html и теперь она работает.

Вискаино
источник
0

Ну, иногда стоит проверить, переопределяли ли вы глобальные отображения каким-либо контроллером остальных. Простой пример ошибки (котлин):

@RestController("/foo")
class TrainingController {

    @PostMapping
    fun bazz(@RequestBody newBody: CommandDto): CommandDto = return commandDto

}

В приведенном выше случае вы получите при запросе статических ресурсов:

{
    title: "Method Not Allowed",
    status: 405,
    detail: "Request method 'GET' not supported",
    path: "/index.html"
}

Причина этого может быть то , что вы хотели карту , @PostMappingчтобы /fooно забыть о @RequestMappingаннотации на @RestControllerуровне. В этом случае все запросы сопоставлены, POSTи вы не получите статический контент в этом случае.

Пшемек Новак
источник
0

Если вы добавите этот код в ресурсы src / main / resources / static, то весь статический контент из src / main / resources / static будет доступен в "/":

@Configuration
public class StaticResourcesConfigurer implements WebMvcConfigurer {
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/static/");
    }
}
mmirwaldt
источник
0

В моем случае некоторые статические файлы не обслуживались, например шрифты .woff и некоторые изображения. Но css и js работали просто отлично.

Обновление. Гораздо лучшим решением для правильной работы Spring Boot со шрифтами woff является настройка фильтрации ресурсов, упомянутой в этом ответе, например (обратите внимание, что вам нужно включить и исключить):

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <excludes>
            <exclude>static/aui/fonts/**</exclude>
        </excludes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>false</filtering>
        <includes>
            <include>static/aui/fonts/**</include>
        </includes>
    </resource>
</resources>

----- Старое решение (работает, но испортило некоторые шрифты) -----

Другое решение состояло в том, чтобы отключить сопоставление паттерна суффикса с setUseSuffixPatternMatch(false)

@Configuration
public class StaticResourceConfig implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        // disable suffix matching to serve .woff, images, etc.
        configurer.setUseSuffixPatternMatch(false);
    }
}

Кредиты: @Abhiji указал мне 4. в правильном направлении!

LukeSolar
источник
0

Запросы к / ** оцениваются для статических расположений, настроенных в resourceProperties .

добавление следующего в application.properties, возможно, единственное, что вам нужно сделать ...

spring.resources.static-locations=classpath:/myresources/

это перезапишет статические местоположения по умолчанию, которые:

ResourceProperties.CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
        "classpath:/resources/", "classpath:/static/", "classpath:/public/" };

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

Выполнение запроса: если бы файл example.html хранился в /public/example.html, я мог бы получить к нему следующий доступ:

<host>/<context-path?if you have one>/example.html

Если бы я хотел еще один URI, как <host>/<context-path>/magico/*для файлов в classpath: / magicofiles / *, вам нужно немного больше конфигурации

@Configuration
class MyConfigClass implements WebMvcConfigurer

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/magico/**").addResourceLocations("/magicofiles/");
}
Свен Дханс
источник
-1

Как сказано выше, файл должен быть в $ClassPath/static/images/name.png(/ static или / public или / resources или / META-INF / resources). Этот $ ClassPath означает main/resourcesилиmain/java dir.

Если ваши файлы не в стандартных папках, вы можете добавить следующую конфигурацию:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/lib/**"); // like this
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        // ... etc.
}
...

}

Mavlarn
источник