Spring Boot не обслуговує статичний вміст


173

Я не можу отримати проект Spring-boot для розміщення статичного вмісту.

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

Я намагався поставити статичні файли public, resourcesі , META-INF/resourcesале нічого не працює.

Якщо я jar -tvf app.jar, я можу побачити, що файли знаходяться всередині банку в правій папці: /static/images/head.pngнаприклад, але викликаю:, http://localhost:8080/images/head.pngя отримую лише404

Будь-які ідеї, чому весняний черевик цього не знаходить? (Я використовую 1.1.4 BTW)


6
За замовчуванням обробка ресурсів відображає в / **. Я ще раз перевірив, чи це ввімкнено. Якщо це так, ви побачите рядок, що закінчується "Mapped URL path [/ **] to the handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]" у виводі під час запуску програми. Іншою можливістю є власний контролер, який також відображений у / ** та має перевагу над обробником ресурсів. Опублікування результатів запуску вашої програми полегшило б нам побачити, що відбувається.
Енді Вілкінсон,

12
Я здогадуюсь, що @EnableWebMvcу вашому додатку є (або еквівалент). Це відключить конфігурацію MVC Boot за замовчуванням.
Дейв Сайер

1
Ні, у мене немає ніде @EnableWebMvc. Я цього не розумію. Зараз це відбувається і з шаблонами. Будь-який з моїх шаблонів (фрімаркер) знайде завантажувач весняного завантаження.
Vinicius Carvalho

2
Я стикаюся з подібною проблемою, і мені не пощастило з жодною з рекомендованих резолюцій. Якщо хтось міг би бути таким добрим, щоб подивитися і вказати саме на те, що я роблю неправильно, було б дуже вдячно !!! github.com/kylebober/kbss
Кайл С. Бобер

3
Я виявив, що якщо у мене є файл src / main / ресурси / 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. Клас, який відповідає за вирішення шляху, станом на весну 4.1 org.springframework.web.servlet.resource.PathResourceResolver.

  4. Суфікс шаблон включений за замовчуванням , що означає для запиту URL /index.html, Spring збирається шукати обробник відповідних /index.html. Це питання, якщо має намір подавати статичний контент. Щоб вимкнути це, розтягніть WebMvcConfigurerAdapter(але не використовуйте @EnableWebMvc) та замініть, configurePathMatchяк показано нижче:

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

IMHO, єдиний спосіб мати менше помилок у вашому коді - це не писати код, коли це можливо. Використовуйте те, що вже надано, навіть якщо це потребує деяких досліджень, повернення того варте.


3
ця відповідь дійсно після багатьох досліджень. Чудовий, який слід прочитати
Еканш Растогі

2
Якби я був головним, я взяв би цю відповідь і вклав її в документацію про весняні завантаження
aliopi

2
@Abhijit Sarkar Я мав на увазі компанію Pivotal , вибачте за будь-які погані почуття, але це не було призначено. Основний - власник Spring, якщо я маю рацію. Я міг би це документувати, але у них є люди, яким за це платять, тому вони повинні це робити: P
aliopi

1
@aliopi Spring - проект з відкритим кодом.
Abhijit Sarkar

3
єдиний спосіб мати менше помилок у вашому коді - це не писати код [...] дійсно так.
Clijsters

78

На відміну від того, що відбувається у весняному завантаженні, щоб отримати мій jar-boot jar для обслуговування вмісту: мені довелося додати спеціально зареєструвати мій src / main / ресурси / статичний вміст через цей конфігураційний клас:

@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);
    }
}

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анотацією. Я думаю, що цей відображений шлях за замовчуванням до "/" та заблокував статичне відображення ресурсів вмісту.


1
Вирішили це за мене! У мене був контролер, позначений на @RestController ("/ blubb"), що, очевидно, неправильно, але в деяких випадках ти не бачиш лісу для дерев. Змінивши його на @RestController @RequestMapping ("/ blubb") вирішив це
krinklesaurus

Я радий, що це допомогло, і мене розвеселило те, що вислів "Не можна побачити ліс для всіх дерев" існує як в німецькій, так і в шведській мовах :)
Йоганнес

2
Ви також можете явно додати @RequestMapping ("/"), якщо наміром є як подання статичного вмісту, так і наявність динамічного обробника для кореневих запитів.
mjj1409

1
Нічого ... Ви витратили на це один день. У моєму весняному завантаженні mvc додаток використовує безпеку весни і не бачив файл styles.css. Я вважаю, що безпека не дозволила .jsp отримати доступ до файлу styles.css. У мене в контролері було @RequestMapping ({"", "/", "/ home"}). Вийняв "" і "/", і мій MVC почав працювати чудово ... Дуже дивно.
skmansfield

3
@Shafiul Ні додавання EnableAutoConfiguration та SpringBootApplication є зайвим! "@SpringBootApplication" містить "@EnableAutoConfiguration"
Дехан де Кроос

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, вам насправді цього не потрібно для вирішення проблеми ОП.
Програмний інженер

@EngineerDollery дякую за коментар, це був мій намір, але я прямо додав пояснення
Франциско 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 .


2
Так, я це робив, я намагався, як вказують документи. Але нічого не працює. Я не розумію, чому ресурс взагалі не знайдений. Я намагався вивчити зразки, як не дивно, немає зразка, який би використовував структуру, запропоновану документами. У тій, яку ви щойно вставили, використовується папка шаблонів, я припускаю, що це для конфігурації або швидкості чебрецю.
Вініцій Карвальо

Зразок веб-інтерфейсу ( github.com/spring-projects/spring-boot/tree/v1.1.3.RELEASE/… ) подає статичний вміст.
Енді Вілкінсон,

Я погоджуюся з @ViniciusCarvalho, я намагався будь-яку можливу комбінацію, щоб отримати css / js в потрібному місці, і, здається, це не можна зробити. Навіть якщо я відвідую localhost: 8089 / css / styles.css, я нічого не бачу. У мене є єдине правило змінити колір тіла.
Хатем Джабер

10

У мене була ця проблема, а потім зрозумів, що я визначив у своїй програмі. Властивості:

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

Що переважало все інше, що я спробував. У моєму випадку я хотів зберегти обоє, тому я просто зберігав майно та додав:

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

Які подавали файли з src / main / ресурси / 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
    }
.....
}

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


WebMvcConfigurerAdapter застарілий станом на Spring Boot 5.0. Подивлячись, це виявляється в Javadocs для цього класу: "на 5.0 WebMvcConfigurer є методи за замовчуванням (які можливі базовою лінією Java 8) і можуть бути реалізовані безпосередньо без необхідності цього адаптера." Тому я думаю, що зараз реалізовано WebMvcConfigurer.
Марво

@Marvo - це точно так. Правильний спосіб зробити це в 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


3

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

Виконання вище двох справ вирішило мою проблему. Тепер моє весняне завантаження завантажує статичні ресурси з будь-яких проблем. @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>

Видалення @EnableWebMvc зробило це для мене! Дякую
turboemu

3

Поставте статичні ресурси під каталог:

/src/main/resources/static

додати цю властивість у файл application.properties

server.servlet.context-path=/pdx

Ви можете отримати доступ з http: // localhost: 8080 / pdx / images / image.jpg

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


1
Я не знаю, як сказати Спасибі вам. Брат, ти великий. Я спробував майже всі рішення вище, але це найкращий і найкоротший.
user12061795

2

Якщо проблема виникає під час запуску програми з IDE (тобто, починаючи з Eclipse або IntelliJ Idea) та використовуючи Maven, ключ до рішення знаходиться у документації Spring-boot Getting Starting :

Якщо ви використовуєте Maven, виконайте:

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

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


1

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

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

Здається, що Spring-web / spring-webmvc є важливою перехідною залежністю, яка змушує ввімкнути автоматичну конфігурацію весняного завантаження.


1

FYI: Я також помітив, що я можу зіпсувати ідеально працюючу додаток для весняного завантаження і не дозволяти йому подавати вміст зі статичної папки, якщо я додаю невдалий контролер спокою, як так

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

У цьому прикладі після додавання поганого контролера до проекту, коли браузер запитує файл, доступний у статичній папці, відповідь про помилку: ' 405 метод не дозволений ".

Шляхи сповіщення не відображаються на прикладі поганого контролера.


1

Я зіткнувся з тією ж проблемою у весняному завантаженні 2.1.3, кажучи, що ресурс не знайдено 404. Я видалено нижче з applicatiion.properties .

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

Вилучено @enableWebMVC та видалено будь-яку перевагу WebMvcConfigurer

// @ EnableWebMvc

Також переконайтеся, що у вашому конфігурації є @EnableAutoConfiguration .

І покладіть всі статичні ресурси в src / main / ресурси / статичні, і це просто спрацювало як магія нарешті ..


моя весняна версія в 2.2.6, і у мене є @EnableAutoConfiguration та файли під src / main / ресурси / 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

Була така ж проблема, використовуючи градули і затемнення і витрачав години, намагаючись розібратися в цьому.

Не потрібно кодування, трюк полягає в тому, що для створення статичної папки під src / main / ресурси потрібно використовувати параметр меню New-> Source Folder (NOT New -> Folder). Не знаю, чому це працює, але зробив нову -> вихідну папку, тоді я назвав папку статичною (тоді діалогове вікно вихідної папки дає помилку, для якої потрібно перевірити: Оновіть фільтри виключення в інших папках джерела, щоб вирішити введення). У свою нову статичну папку я додав index.html і тепер вона працює.


0

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

@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 / ресурси / статичні, якщо ви додасте цей код, то весь статичний вміст з src / main / ресурси / статичний буде доступний у розділі "/":

@Configuration
public class StaticResourcesConfigurer implements WebMvcConfigurer {
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/static/");
    }
}

0

У моєму випадку деякі статичні файли не подавались, як-от шрифти та деякі зображення. Але 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. у правильному напрямку!


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

Якщо я хотів би отримати інший урі, як <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, (/ статичний або / загальнодоступний / / ресурси або / META-INF / ресурси). Це $ ClassPath означає main/resourcesабо main/javaреж.

Якщо ваші файли не в стандартних режимах, ви можете додати таку конфігурацію:

@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.
}
...

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.