Nie mogę sprawić, by mój projekt Spring-boot obsługiwał zawartość statyczną.
Umieściłem folder o nazwie static
pod src/main/resources
. Wewnątrz mam folder o nazwie images
. Kiedy pakuję aplikację i ją uruchamiam, nie może znaleźć obrazów, które umieściłem w tym folderze.
Starałem się umieścić pliki w statycznych public
, resources
a META-INF/resources
jednak nic nie działa.
Jeśli ja jar -tvf app.jar widzę, że pliki znajdują się wewnątrz jar we właściwym folderze: /static/images/head.png
na przykład, ale dzwoniąc :,
http://localhost:8080/images/head.png
wszystko, co otrzymuję, to404
Jakieś pomysły, dlaczego spring-boot tego nie znajduje? (Używam wersji 1.1.4 BTW)
spring
spring-mvc
spring-boot
Vinicius Carvalho
źródło
źródło
@EnableWebMvc
(lub odpowiednik) w swojej aplikacji. To wyłączyłoby domyślną konfigurację Boot MVC.Odpowiedzi:
Nie wskrzeszać zmarłych po ponad roku, ale wszystkie poprzednie odpowiedzi pomijają kilka kluczowych punktów:
@EnableWebMvc
na twojej klasie wyłączy sięorg.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
. To dobrze, jeśli chcesz mieć pełną kontrolę, ale poza tym jest to problem.Nie ma potrzeby pisania żadnego kodu, aby dodać inną lokalizację dla zasobów statycznych oprócz tego, co już zostało udostępnione. Patrząc na
org.springframework.boot.autoconfigure.web.ResourceProperties
wersję 1.3.0.RELEASE, widzę pole,staticLocations
które można skonfigurować wapplication.properties
. Oto fragment ze źródła:Jak wspomniano wcześniej, adres URL żądania zostanie rozwiązany względem tych lokalizacji. W ten sposób
src/main/resources/static/index.html
zostanie obsłużony, gdy adres URL żądania to/index.html
. Klasa odpowiedzialna za rozwiązywanie ścieżki, od wersji Spring 4.1, toorg.springframework.web.servlet.resource.PathResourceResolver
.Dopasowywanie wzorca sufiksu jest domyślnie włączone, co oznacza, że w przypadku adresu URL żądania
/index.html
Spring będzie szukał programów obsługi odpowiadających/index.html
. Jest to problem, jeśli intencją jest dostarczanie treści statycznych. Aby to wyłączyć, rozszerzWebMvcConfigurerAdapter
(ale nie używaj@EnableWebMvc
) i zastąp,configurePathMatch
jak pokazano poniżej:IMHO, jedynym sposobem, aby mieć mniej błędów w kodzie, jest nie pisać kodu, gdy tylko jest to możliwe. Skorzystaj z tego, co już zostało dostarczone, nawet jeśli wymaga to pewnych badań, zwrot jest tego wart.
źródło
W przeciwieństwie do tego, co stwierdza spring-boot, aby mój spring-boot jar obsługiwał zawartość: musiałem specjalnie zarejestrować moją zawartość src / main / resources / static za pomocą tej klasy konfiguracyjnej:
źródło
Miałem podobny problem i okazało się, że prostym rozwiązaniem było rozszerzenie mojej klasy konfiguracji
WebMvcAutoConfiguration
:Nie potrzebowałem żadnego innego kodu, aby umożliwić obsługę mojej statycznej zawartości, jednak umieściłem katalog o nazwie
public
undersrc/main/webapp
i skonfigurowałem maven tak, aby wskazywałsrc/main/webapp
jako katalog zasobów. Oznacza to, żepublic
jest kopiowany dotarget/classes
, a zatem znajduje się w ścieżce klas w czasie wykonywania, aby spring-boot / tomcat mógł znaleźć.źródło
Poszukaj kontrolerów zamapowanych na „/” lub bez mapowanych ścieżek.
Miałem taki problem, otrzymywałem 405 błędów i przez wiele dni mocno waliłem w głowę. Problemem okazał się
@RestController
kontroler z adnotacjami, do którego zapomniałem dodać@RequestMapping
adnotację. Domyślam się, że ta zmapowana ścieżka ma wartość domyślną „/” i blokuje mapowanie zasobów zawartości statycznej.źródło
Konfigurację można wykonać w następujący sposób:
Ważne jest tutaj, że twoja metoda
WebMvcConfig
może przesłonićaddResourceHandlers
i dlatego musisz jawnie wywołaćsuper.addResourceHandlers(registry)
(prawdą jest, że jeśli jesteś zadowolony z domyślnych lokalizacji zasobów, nie musisz nadpisywać żadnej metody).Inną rzeczą, którą należy skomentował tutaj jest to, że te lokalizacje domyślne zasobów (
/static
,/public
,/resources
i/META-INF/resources
) będą rejestrowane tylko wtedy, gdy nie ma już obsługi zasobów odwzorowywane na/**
.Od tego momentu, jeśli masz na przykład obraz
src/main/resources/static/images
nazwanyimage.jpg
, możesz uzyskać do niego dostęp za pomocą następującego adresu URL:http://localhost:8080/images/image.jpg
(serwer uruchomiony na porcie 8080 i aplikacja wdrożona w kontekście głównym).źródło
@EnableWebMvc
iWebMvcAutoConfigurationAdapter
. Wielkie dzięki!Czy sprawdziłeś dokumentację dotyczącą Spring Boot ?
Możesz również porównać swój projekt z przewodnikiem Udostępnianie treści internetowych za pomocą Spring MVC lub sprawdzić kod źródłowy projektu spring-boot-sample-web-ui .
źródło
Miałem dokładnie ten problem, a potem zdałem sobie sprawę, że zdefiniowałem w mojej application.properties:
Co przeważało nad wszystkim, czego próbowałem. W moim przypadku chciałem zachować oba, więc po prostu zachowałem nieruchomość i dodałem:
Który udostępnił pliki z src / main / resources / static jako localhost: {port} /file.html.
Żadne z powyższych nie zadziałało dla mnie, ponieważ nikt nie wspomniał o tej małej właściwości, którą można łatwo skopiować z Internetu, aby służyć innym celom;)
Mam nadzieję, że to pomoże! Pomyślałem, że będzie dobrze pasował do tego długiego postu z odpowiedziami dla osób z tym problemem.
źródło
spring.resources.static-locations=file:/var/www/static,classpath:static
w pliku application.properties, ale to nie zadziałało. Używam@EnableWebMvc
w mojej klasie konfiguracji.security.ignored
isecurity.publicPaths
Myślę, że poprzednie odpowiedzi bardzo dobrze odnoszą się do tematu. Dodam jednak, że w jednym przypadku, gdy w aplikacji włączono Spring Security, być może będziesz musiał wyraźnie powiedzieć Springowi, aby zezwolił na żądania do innych statycznych katalogów zasobów, takich jak na przykład „/ static / fonts” .
W moim przypadku domyślnie dozwolone były "/ static / css", "/ static / js", "/ static / images", ale / static / fonts / ** zostało zablokowane przez moją implementację Spring Security.
Poniżej znajduje się przykład, jak to naprawiłem.
źródło
Żeby dodać jeszcze jedną odpowiedź na stare pytanie ... Wspomniano już o
@EnableWebMvc
zapobieganiuWebMvcAutoConfiguration
ładowaniu, czyli kodzie odpowiedzialnym za tworzenie statycznych procedur obsługi zasobów. Istnieją również inne warunki, które również uniemożliwiająWebMvcAutoConfiguration
ładowanie. Najlepszym sposobem, aby to zobaczyć, jest spojrzenie na źródło: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
W moim przypadku włączyłem bibliotekę, która miała klasę, z
WebMvcConfigurationSupport
której rozszerzała się, co jest warunkiem uniemożliwiającym autokonfigurację:Ważne jest, aby nigdy nie wychodzić z
WebMvcConfigurationSupport
. Zamiast tego rozszerzWebMvcConfigurerAdapter
.UPDATE: Właściwym sposobem na zrobienie tego w 5.x jest zaimplementowanie WebMvcConfigurer
źródło
WebMvcConfigurer
.U mnie działa to rozwiązanie:
Najpierw umieść folder zasobów w webapp / WEB-INF, zgodnie z następującą strukturą
Po drugie, wiosną plik konfiguracyjny
Następnie możesz uzyskać dostęp do zawartości zasobów, takich jak http: // localhost: 8080 / resource / image / yourimage.jpg
źródło
Są dwie rzeczy do rozważenia (Spring Boot v1.5.2.RELEASE) - 1) Sprawdź wszystkie klasy kontrolera pod kątem adnotacji @EnableWebMvc, usuń ją, jeśli istnieje 2) Sprawdź klasy kontrolera, dla których jest używana adnotacja - @RestController lub @Controller . Nie mieszaj zachowania Rest API i MVC w jednej klasie. W przypadku MVC użyj @Controller, a dla interfejsu API REST użyj @RestController
Wykonanie powyższych dwóch czynności rozwiązało mój problem. Teraz mój wiosenny rozruch ładuje statyczne zasoby bez żadnych problemów. @Controller => load index.html => ładuje pliki statyczne.
źródło
Umieść zasoby statyczne w katalogu:
dodaj tę właściwość w pliku application.properties
Możesz uzyskać dostęp z http: // localhost: 8080 / pdx / images / image.jpg
źródło
W przypadku pojawienia się problemu podczas uruchamiania aplikacji z poziomu IDE (tj. Zaczynając od Eclipse lub IntelliJ Idea) i przy użyciu Maven, klucz do rozwiązania znajduje się w dokumentacji Spring-boot Getting Started :
Ważną częścią tego jest dodanie
package
celu do uruchomienia przed faktycznym uruchomieniem aplikacji. (Idea:Run
menuEdit Configrations...
,Add
i tam wybraćRun Maven Goal
i określićpackage
cel w tej dziedzinie)źródło
Używam 1.3.5 i hostuję kilka usług REST za pośrednictwem implementacji Jersey. To działało dobrze, dopóki nie zdecydowałem się dodać kilka plików HTMLs + js. Żadna z odpowiedzi udzielonych na tym forum nie pomogła mi. Jednak kiedy dodałem następującą zależność w moim pom.xml, cała zawartość w src / main / resources / static została ostatecznie wyświetlona przez przeglądarkę:
Wygląda na to, że spring-web / spring-webmvc to ważna zależność przechodnia, która powoduje włączenie automatycznej konfiguracji Spring Boot.
źródło
FYI: Zauważyłem również, że mogę zepsuć doskonale działającą aplikację do rozruchu wiosennego i uniemożliwić jej serwowanie zawartości z folderu statycznego, jeśli dodam zły kontroler odpoczynku, taki jak ten
W tym przykładzie po dodaniu złego kontrolera do projektu, gdy przeglądarka zapyta o plik dostępny w folderze statycznym, odpowiedź o błędzie to „ 405 Metoda niedozwolona ”.
Zwróć uwagę, że ścieżki nie są mapowane w przykładzie złego kontrolera.
źródło
Miałem ten sam problem w Spring Boot 2.1.3, mówiąc, że nie znaleziono zasobu 404. Usunąłem poniżej z pliku application.properties .
Usunięto @enableWebMVC i usunięto wszelkie nadpisywanie WebMvcConfigurer
Upewnij się również, że masz @EnableAutoConfiguration w swoim config.
I umieść wszystkie statyczne zasoby w src / main / resources / static i wreszcie zadziałało jak magia.
źródło
Używając Spring Boot 2. *, mam kontroler, który mapuje trasy
GetMapping({"/{var}", "/{var1}/{var2}", "/{var1}/{var2}/{var3}"})
i wysuwa moją aplikację, która przestaje obsługiwać zasoby.wiem, że takie trasy nie są wskazane, ale wszystko zależy od aplikacji, którą budujesz (w moim przypadku nie mam wyboru, muszę mieć takie trasy)
więc oto mój trik, aby upewnić się, że moja aplikacja ponownie obsługuje zasoby. Po prostu mam kontroler, który mapuje do moich zasobów. ponieważ wiosna najpierw dopasuje trasę bezpośrednią przed jakąkolwiek, która ma zmienną, postanowiłem dodać metodę kontrolera, która mapuje
/imgaes/{name}
i powtórzy to samo dla innych zasobówi to rozwiązało mój problem
źródło
Miałem ten sam problem, używając gradle i eclipse i spędzając godziny na próbach rozwiązania tego problemu.
Nie jest wymagane kodowanie, sztuczka polega na tym, że musisz użyć opcji menu Nowy-> Folder źródłowy (NIE Nowy -> Folder), aby utworzyć folder statyczny w lokalizacji src / main / resources. Nie wiem, dlaczego to działa, ale zrobiłem nowy -> folder źródłowy, a następnie nazwałem folder statyczny (wtedy okno dialogowe folderu źródłowego wyświetla błąd, który należy sprawdzić: Zaktualizuj filtry wykluczeń w innych folderach źródłowych, aby rozwiązać zagnieżdżenie). Mój nowy folder statyczny dodałem index.html i teraz działa.
źródło
Cóż, czasami warto sprawdzić, czy nadpisałeś globalne mapowania jakimś kontrolerem reszty. Prosty przykładowy błąd (kotlin):
W powyższym przypadku, gdy poprosisz o zasoby statyczne, otrzymasz:
Powodem tego może być fakt, że chcesz na mapie
@PostMapping
, aby/foo
jednak zapomnieć o@RequestMapping
adnotacji na@RestController
poziomie. W takim przypadku wszystkie żądania są mapowanePOST
i nie otrzymasz w tym przypadku zawartości statycznej.źródło
Biorąc pod uwagę zasoby w src / main / resources / static, jeśli dodasz ten kod, cała zawartość statyczna z src / main / resources / static będzie dostępna pod „/”:
źródło
W moim przypadku nie wyświetlono niektórych plików statycznych, takich jak czcionki .woff i niektóre obrazy. Ale css i js działały dobrze.
Aktualizacja: O wiele lepszym rozwiązaniem, aby Spring Boot poprawnie obsługiwał czcionki woff, jest na przykład skonfigurowanie filtrowania zasobów wspomnianego w tej odpowiedzi (pamiętaj, że potrzebujesz zarówno opcji włączania, jak i wykluczania):
----- Stare rozwiązanie (działa, ale spowoduje uszkodzenie niektórych czcionek) -----
Innym rozwiązaniem było wyłączenie dopasowywania wzorców sufiksów z
setUseSuffixPatternMatch(false)
Podziękowania: @Abhiji wskazał mi 4. we właściwym kierunku!
źródło
Żądania do / ** są oceniane w statycznych lokalizacjach skonfigurowanych w resourceProperties .
dodanie następującego elementu do application.properties może być jedyną rzeczą, którą musisz zrobić ...
spowoduje to nadpisanie domyślnych lokalizacji statycznych, czyli:
Możesz nie chcieć tego robić i po prostu upewnij się, że Twoje zasoby trafiają do jednego z tych domyślnych folderów.
Wykonywanie żądania: Gdybym miał przykład.html przechowywany w /public/example.html, to mogę uzyskać do niego dostęp w następujący sposób:
Jeśli chciałbym mieć inny
<host>/<context-path>/magico/*
identyfikator URI, taki jak dla plików w ścieżce klas: / magicofiles / *, potrzebujesz trochę więcej konfiguracjiźródło
Jak wspomniano powyżej, plik powinien znajdować się w
$ClassPath/static/images/name.png
, (/ static lub / public lub / resources lub / META-INF / resources). Ta $ ClassPath oznaczamain/resources
lubmain/java
reż.Jeśli twoje pliki nie znajdują się w standardowych katalogach, możesz dodać następującą konfigurację:
}
źródło