Я не могу заставить мой проект 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)
spring
spring-mvc
spring-boot
Виниций Карвалью
источник
источник
@EnableWebMvc
(или эквивалент) в вашем приложении. Это отключило бы конфигурацию Boot MVC по умолчанию.Ответы:
Не воскрешать мертвых более чем через год, но во всех предыдущих ответах упущены некоторые важные моменты:
@EnableWebMvc
на вашем уроке отключатorg.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
. Это хорошо, если вы хотите полный контроль, но в противном случае это проблема.Нет необходимости писать какой-либо код, чтобы добавить другое место для статических ресурсов в дополнение к тому, что уже предоставлено. Глядя на
org.springframework.boot.autoconfigure.web.ResourceProperties
v1.3.0.RELEASE, я вижу поле,staticLocations
которое можно настроить вapplication.properties
. Вот фрагмент из источника:Как упоминалось ранее, URL запроса будет разрешен относительно этих мест. Таким образом
src/main/resources/static/index.html
будет обслуживаться, когда запрос URL/index.html
. Класс, который отвечает за разрешение пути, начиная с Spring 4.1, являетсяorg.springframework.web.servlet.resource.PathResourceResolver
.Сопоставление с суффиксным шаблоном включено по умолчанию, что означает, что для URL-адреса запроса
/index.html
Spring будет искать соответствующие обработчики/index.html
. Это проблема, если целью является предоставление статического контента. Чтобы отключить это, расширьтеWebMvcConfigurerAdapter
(но не используйте@EnableWebMvc
) и переопределите,configurePathMatch
как показано ниже:ИМХО, единственный способ уменьшить количество ошибок в вашем коде - это не писать код, когда это возможно. Используйте то, что уже предоставлено, даже если это потребует некоторых исследований, отдача того стоит.
источник
В отличие от того, что говорится в Spring-Boot, чтобы заставить мой Spring-Boar-файл обслуживать контент: мне пришлось добавить специально зарегистрировать мой контент src / main / resources / static через этот класс конфигурации:
источник
У меня была похожая проблема, и оказалось, что простым решением было расширить класс конфигурации
WebMvcAutoConfiguration
:Мне не нужен был какой-либо другой код, который позволял бы обслуживать мой статический контент, однако я поместил каталог
public
под именемsrc/main/webapp
и настроил maven так, чтобы он указывал наsrc/main/webapp
каталог ресурсов. Это означает, чтоpublic
он скопированtarget/classes
и, следовательно, находится в пути к классам во время выполнения для поиска spring-boot / tomcat.источник
Найдите контроллеры, сопоставленные с «/» или без пути.
У меня была такая проблема, я получил 405 ошибок и много дней бился головой. Проблемой оказался
@RestController
аннотированный контроллер, который я забыл аннотировать@RequestMapping
аннотацией. Я предполагаю, что этот сопоставленный путь по умолчанию равен "/" и заблокировал статическое сопоставление ресурсов контента.источник
Конфигурация может быть выполнена следующим образом:
Здесь важно то, что вы
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 и приложение развернуто в корневом контексте).источник
@EnableWebMvc
иWebMvcAutoConfigurationAdapter
. Спасибо большое время!Вы проверяли справочные документы Spring Boot ?
Вы также можете сравнить свой проект с руководством по обслуживанию веб-контента в Spring MVC или проверить исходный код проекта spring-boot-sample-web-ui .
источник
У меня возникла именно эта проблема, затем я понял, что определил в своем application.properties:
Который отменял все остальное, что я пробовал. В моем случае я хотел оставить оба, поэтому я просто сохранил свойство и добавил:
Который обслуживал файлы из src / main / resources / static как localhost: {port} /file.html.
Ничто из вышеперечисленного не сработало для меня, потому что никто не упомянул об этом небольшом свойстве, которое можно было легко скопировать из Интернета для другой цели;)
Надеюсь, поможет! Я подумал, что это будет хорошо в этом длинном посте ответов для людей с этой проблемой.
источник
spring.resources.static-locations=file:/var/www/static,classpath:static
в мои application.properties, но у меня это не сработало. Я использую@EnableWebMvc
на своем классе конфигурации.security.ignored
иsecurity.publicPaths
Я думаю, что предыдущие ответы очень хорошо относятся к теме. Тем не менее, я бы добавил, что в одном случае, когда в вашем приложении включена Spring Security, вам, возможно, придется специально указать Spring, чтобы он разрешал запросы к другим каталогам статических ресурсов, например, "/ static / fonts" .
В моем случае у меня были "/ static / css", "/ static / js", "/ static / images" по умолчанию, но / static / fonts / ** была заблокирована моей реализацией Spring Security.
Ниже приведен пример того, как я это исправил.
источник
Просто чтобы добавить еще один ответ на старый вопрос ... Люди упоминали, что
@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
и это условие, которое предотвратит автоконфигурацию:Важно никогда не расширяться
WebMvcConfigurationSupport
. Вместо этого простирайтесь отWebMvcConfigurerAdapter
.ОБНОВЛЕНИЕ: правильный способ сделать это в 5.x - реализовать WebMvcConfigurer
источник
WebMvcConfigurer
.Это решение работает для меня:
Сначала поместите папку ресурсов в webapp / WEB-INF, как указано в структуре
Во-вторых, весной конфигурационный файл
Затем вы можете получить доступ к содержимому вашего ресурса, например, http: // localhost: 8080 / resource / image / yourimage.jpg
источник
Есть две вещи, которые следует учитывать (Spring Boot v1.5.2.RELEASE): 1) Проверить все классы контроллера для аннотации @EnableWebMvc, удалить ее, если есть 2) Проверить классы контроллера, для которых используется аннотация - @RestController или @Controller , Не смешивайте Rest API и поведение MVC в одном классе. Для MVC используйте @Controller, а для REST API используйте @RestController
Выполнение 2-х вещей решило мою проблему. Теперь моя весенняя загрузка загружает статические ресурсы без каких-либо проблем. @Controller => load index.html => загружает статические файлы.
источник
Поместите статические ресурсы в каталог:
добавить это свойство в файл application.properties
Вы можете получить доступ с http: // localhost: 8080 / pdx / images / image.jpg
источник
Если проблема возникает при запуске приложения из среды IDE (т.е. начиная с Eclipse или IntelliJ Idea) и с использованием Maven, ключом к решению является документация Spring-boot Getting Started :
Важной частью является добавление
package
цели, которая будет запущена до фактического запуска приложения. (Идея:Run
менюEdit Configrations...
,Add
и там выберитеRun Maven Goal
и укажитеpackage
цель в поле)источник
Я использую 1.3.5 и размещаю кучу REST-сервисов через реализацию на Джерси. Это работало нормально, пока я не решил добавить пару файлов HTMLs + js. Ни один из ответов на этом форуме не помог мне. Однако, когда я добавил следующую зависимость в свой pom.xml, все содержимое в src / main / resources / static наконец показывалось через браузер:
Кажется, что spring-web / spring-webmvc является важной транзитивной зависимостью, которая позволяет включить автоматическую настройку весенней загрузки.
источник
К вашему сведению: я также заметил, что могу испортить отлично работающее приложение с весенней загрузкой и запретить ему показывать содержимое из статической папки, если я добавлю контроллер плохого отдыха, например, так
В этом примере после добавления плохого контроллера в проект, когда браузер запрашивает файл, доступный в статической папке, ответом на ошибку является « 405 Method Not Allowed ».
Пути уведомления не отображаются в примере плохого контроллера.
источник
Я столкнулся с той же проблемой в весенней загрузке 2.1.3, говоря, что ресурс не найден 404. Я удалил ниже из applicationatiion.properties .
Удалил @enableWebMVC и удалил все переопределения WebMvcConfigurer
Также убедитесь, что у вас есть @EnableAutoConfiguration в вашей конфигурации.
И поместите все статические ресурсы в src / main / resources / static, и это, наконец, сработало как волшебство ..
источник
используя весеннюю загрузку 2. *, у меня есть контроллер, который отображается на маршруты
GetMapping({"/{var}", "/{var1}/{var2}", "/{var1}/{var2}/{var3}"})
и бум, мое приложение перестает обслуживать ресурсы.я знаю, что не рекомендуется иметь такие маршруты, но все зависит от приложения, которое вы создаете (в моем случае, у меня нет выбора, кроме как иметь такие маршруты)
так вот мой взлом, чтобы убедиться, что мое приложение снова обслуживает ресурсы. У меня просто есть контроллер, который отображается на мои ресурсы. так как весна сначала будет соответствовать прямому маршруту перед тем, у которого есть переменная, я решил добавить метод контроллера, который сопоставляется
/imgaes/{name}
и повторяется для других ресурсови это решило мою проблему
источник
Возникла такая же проблема, используя gradle и eclipse, и часами пытался ее выяснить.
Кодирование не требуется, уловка в том, что вы должны использовать пункт меню New-> Source Folder (NOT New -> Folder), чтобы создать статическую папку в src / main / resources. Не знаю, почему это работает, но сделал новую -> исходную папку, затем я назвал папку статической (тогда в диалоговом окне с исходной папкой выдается сообщение об ошибке, для которого необходимо проверить: обновить фильтры исключений в других исходных папках, чтобы разрешить вложение). В мою новую статическую папку я добавил index.html и теперь она работает.
источник
Ну, иногда стоит проверить, переопределяли ли вы глобальные отображения каким-либо контроллером остальных. Простой пример ошибки (котлин):
В приведенном выше случае вы получите при запросе статических ресурсов:
Причина этого может быть то , что вы хотели карту ,
@PostMapping
чтобы/foo
но забыть о@RequestMapping
аннотации на@RestController
уровне. В этом случае все запросы сопоставлены,POST
и вы не получите статический контент в этом случае.источник
Если вы добавите этот код в ресурсы src / main / resources / static, то весь статический контент из src / main / resources / static будет доступен в "/":
источник
В моем случае некоторые статические файлы не обслуживались, например шрифты .woff и некоторые изображения. Но css и js работали просто отлично.
Обновление. Гораздо лучшим решением для правильной работы Spring Boot со шрифтами woff является настройка фильтрации ресурсов, упомянутой в этом ответе, например (обратите внимание, что вам нужно включить и исключить):
----- Старое решение (работает, но испортило некоторые шрифты) -----
Другое решение состояло в том, чтобы отключить сопоставление паттерна суффикса с
setUseSuffixPatternMatch(false)
Кредиты: @Abhiji указал мне 4. в правильном направлении!
источник
Запросы к / ** оцениваются для статических расположений, настроенных в resourceProperties .
добавление следующего в application.properties, возможно, единственное, что вам нужно сделать ...
это перезапишет статические местоположения по умолчанию, которые:
Возможно, вы не захотите этого делать и просто убедитесь, что ваши ресурсы окажутся в одной из этих папок по умолчанию.
Выполнение запроса: если бы файл example.html хранился в /public/example.html, я мог бы получить к нему следующий доступ:
Если бы я хотел еще один URI, как
<host>/<context-path>/magico/*
для файлов в classpath: / magicofiles / *, вам нужно немного больше конфигурацииисточник
Как сказано выше, файл должен быть в
$ClassPath/static/images/name.png
(/ static или / public или / resources или / META-INF / resources). Этот $ ClassPath означаетmain/resources
илиmain/java
dir.Если ваши файлы не в стандартных папках, вы можете добавить следующую конфигурацию:
}
источник