Saya tidak bisa mendapatkan proyek Spring-boot untuk menyajikan konten statis.
Saya telah menempatkan folder dengan nama di static
bawah src/main/resources
. Di dalamnya saya memiliki folder bernama images
. Ketika saya mengemas aplikasi dan menjalankannya, ia tidak dapat menemukan gambar yang saya masukkan ke folder itu.
Saya sudah mencoba untuk menempatkan file statis di public
, resources
dan META-INF/resources
tapi tidak ada yang berhasil.
Jika saya topl -tvf app.jar saya dapat melihat bahwa file-file tersebut ada di dalam toples di folder kanan: /static/images/head.png
misalnya, tetapi memanggil :, yang
http://localhost:8080/images/head.png
saya dapatkan hanyalah404
Adakah ide mengapa spring-boot tidak menemukan ini? (Saya menggunakan 1.1.4 BTW)
spring
spring-mvc
spring-boot
Vinicius Carvalho
sumber
sumber
@EnableWebMvc
(atau setara) di aplikasi Anda. Itu akan mematikan konfigurasi Boot MVC default.Jawaban:
Bukan untuk membangkitkan orang mati setelah lebih dari setahun, tetapi semua jawaban sebelumnya kehilangan beberapa poin penting:
@EnableWebMvc
di kelas Anda akan menonaktifkanorg.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
. Tidak apa-apa jika Anda ingin kontrol penuh tetapi sebaliknya, itu masalah.Tidak perlu menulis kode apa pun untuk menambahkan lokasi lain untuk sumber daya statis selain apa yang sudah disediakan. Melihat
org.springframework.boot.autoconfigure.web.ResourceProperties
dari v1.3.0.RELEASE, saya melihat bidangstaticLocations
yang dapat dikonfigurasi diapplication.properties
. Berikut cuplikan dari sumber:Seperti disebutkan sebelumnya, URL permintaan akan diselesaikan relatif terhadap lokasi-lokasi ini. Dengan demikian
src/main/resources/static/index.html
akan disajikan ketika URL permintaan/index.html
. Kelas yang bertanggung jawab untuk menyelesaikan jalur, pada Spring 4.1, adalahorg.springframework.web.servlet.resource.PathResourceResolver
.Pencocokan pola akhiran diaktifkan secara default yang berarti untuk URL permintaan
/index.html
, Spring akan mencari penangan yang sesuai dengan/index.html
. Ini adalah masalah jika tujuannya adalah untuk menyajikan konten statis. Untuk menonaktifkannya, perluasWebMvcConfigurerAdapter
(tapi jangan gunakan@EnableWebMvc
) dan ganticonfigurePathMatch
seperti yang ditunjukkan di bawah ini:IMHO, satu-satunya cara untuk memiliki lebih sedikit bug dalam kode Anda adalah tidak menulis kode bila memungkinkan. Gunakan apa yang sudah disediakan, bahkan jika itu membutuhkan penelitian, pengembaliannya sepadan.
sumber
Tidak seperti apa yang disebutkan oleh pegas boot, untuk mendapatkan pegas boot boot untuk menyajikan konten: Saya harus menambahkan secara khusus mendaftarkan konten src / main / resources / statis melalui kelas konfigurasi ini:
sumber
Saya memiliki masalah yang sama, dan ternyata solusi sederhana adalah memperpanjang kelas konfigurasi saya
WebMvcAutoConfiguration
:Saya tidak memerlukan kode lain untuk memungkinkan konten statis saya untuk dilayani, namun, saya meletakkan direktori yang disebut di
public
bawahsrc/main/webapp
dan mengkonfigurasi pakar untuk menunjuksrc/main/webapp
sebagai direktori sumber daya. Ini berarti bahwapublic
disalin ketarget/classes
, dan karena itu ada di classpath saat runtime untuk menemukan spring-boot / tomcat.sumber
Cari Pengontrol yang dipetakan ke "/" atau tanpa jalur yang dipetakan.
Saya memiliki masalah seperti ini, mendapatkan 405 kesalahan, dan membanting kepala saya keras selama berhari-hari. Masalahnya ternyata menjadi
@RestController
pengontrol beranotasi yang saya lupa anotasi dengan@RequestMapping
anotasi. Saya kira jalur yang dipetakan ini default ke "/" dan memblokir pemetaan sumber daya konten statis.sumber
Konfigurasi dapat dibuat sebagai berikut:
Penting di sini adalah bahwa Anda
WebMvcConfig
mungkin menimpaaddResourceHandlers
metode dan karena itu Anda perlu secara eksplisit memanggilsuper.addResourceHandlers(registry)
(memang benar bahwa jika Anda puas dengan lokasi sumber daya default Anda tidak perlu menimpa metode apa pun).Hal lain yang kebutuhan untuk berkomentar di sini adalah bahwa orang-orang lokasi sumber daya default (
/static
,/public
,/resources
dan/META-INF/resources
) akan didaftarkan hanya jika sudah tidak ada penangan sumber daya dipetakan ke/**
.Mulai saat ini, jika Anda memiliki gambar dengan
src/main/resources/static/images
namaimage.jpg
misalnya, Anda dapat mengaksesnya menggunakan URL berikut:http://localhost:8080/images/image.jpg
(menjadi server dimulai pada port 8080 dan aplikasi yang digunakan untuk konteks konteks).sumber
@EnableWebMvc
danWebMvcAutoConfigurationAdapter
. Terima kasih waktu besar!Apakah Anda memeriksa dokumen referensi Spring Boot ?
Anda juga dapat membandingkan proyek Anda dengan panduan Melayani Konten Web dengan Spring MVC , atau memeriksa kode sumber proyek spring-boot-sample-web-ui .
sumber
Saya mengalami masalah yang tepat ini, kemudian menyadari bahwa saya telah mendefinisikan di application.properties saya:
Yang mengesampingkan semua yang telah saya coba. Dalam kasus saya, saya ingin menyimpan keduanya, jadi saya hanya menyimpan properti dan menambahkan:
Yang melayani file dari src / main / resources / static sebagai localhost: {port} /file.html.
Tidak satu pun di atas bekerja untuk saya karena tidak ada yang menyebutkan properti kecil ini yang dapat dengan mudah disalin dari online untuk melayani tujuan yang berbeda;)
Semoga ini bisa membantu! Berpikir itu akan cocok dengan posting jawaban yang panjang ini untuk orang-orang dengan masalah ini.
sumber
spring.resources.static-locations=file:/var/www/static,classpath:static
ke dalam properti application.prop saya, tetapi itu tidak berhasil untuk saya. Saya menggunakan@EnableWebMvc
kelas konfigurasi saya.security.ignored
dansecurity.publicPaths
Saya pikir jawaban sebelumnya membahas topik dengan sangat baik. Namun, saya menambahkan bahwa dalam satu kasus ketika Anda mengaktifkan Spring Security di aplikasi Anda, Anda mungkin harus secara khusus memberi tahu Spring untuk mengizinkan permintaan ke direktori sumber daya statis lainnya seperti misalnya "/ static / fonts" .
Dalam kasus saya, saya memiliki "/ static / css", "/ static / js", "/ static / images" diizinkan secara default, tetapi / static / font / ** diblokir oleh implementasi Spring Security saya.
Di bawah ini adalah contoh bagaimana saya memperbaikinya.
sumber
Hanya dengan menambahkan jawaban lain untuk pertanyaan lama ... Orang-orang telah menyebutkan surat
@EnableWebMvc
wasiat untuk mencegahWebMvcAutoConfiguration
pemuatan, yang merupakan kode yang bertanggung jawab untuk menciptakan penangan sumber daya statis. Ada kondisi lain yang akan mencegahWebMvcAutoConfiguration
dari memuat juga. Cara paling jelas untuk melihat ini adalah dengan melihat sumbernya: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
Dalam kasus saya, saya menyertakan perpustakaan yang memiliki kelas yang diperluas
WebMvcConfigurationSupport
yang merupakan kondisi yang akan mencegah konfigurasi otomatis:Sangat penting untuk tidak pernah memperpanjang
WebMvcConfigurationSupport
. Sebaliknya, perluas dariWebMvcConfigurerAdapter
.PEMBARUAN: Cara yang tepat untuk melakukan ini dalam 5.x adalah dengan mengimplementasikan WebMvcConfigurer
sumber
WebMvcConfigurer
.Solusi ini bekerja untuk saya:
Pertama, letakkan folder sumber daya di bawah webapp / WEB-INF, sebagai struktur ikuti
Kedua, dalam file konfigurasi musim semi
Kemudian, Anda dapat mengakses konten sumber daya Anda, seperti http: // localhost: 8080 / resource / image / yourimage.jpg
sumber
Ada 2 hal yang perlu dipertimbangkan (Spring Boot v1.5.2.RELEASE) - 1) Periksa semua kelas Controller untuk penjelasan @EnableWebMvc, hapus jika ada 2) Periksa kelas Controller yang menggunakan anotasi - @RestController atau @Controller . Jangan mencampur perilaku Rest API dan MVC dalam satu kelas. Untuk MVC gunakan @Controller dan untuk REST API gunakan @RestController
Melakukan di atas 2 hal menyelesaikan masalah saya. Sekarang booting pegas saya memuat sumber daya statis tanpa masalah apa pun. @Controller => load index.html => memuat file statis.
sumber
Masukkan sumber daya statis di bawah direktori:
tambahkan properti ini di file application.properties
Anda dapat mengakses dari http: // localhost: 8080 / pdx / images / image.jpg
sumber
Jika masalah muncul ketika meluncurkan aplikasi dari dalam IDE (yaitu mulai dari Eclipse atau IntelliJ Idea), dan menggunakan Maven, kunci solusinya adalah dalam dokumentasi Memulai Spring-boot :
Bagian penting yang menambahkan
package
tujuan untuk dijalankan sebelum aplikasi sebenarnya dimulai. (Ide:Run
menu,Edit Configrations...
,Add
, dan ada pilihRun Maven Goal
, dan menentukanpackage
tujuan di lapangan)sumber
Saya menggunakan 1.3.5 dan menjadi tuan rumah sekelompok layanan REST melalui implementasi Jersey. Itu bekerja dengan baik sampai saya memutuskan untuk menambahkan beberapa file HTML + js. Tidak ada jawaban yang diberikan di forum ini yang membantu saya. Namun, ketika saya menambahkan dependensi berikut di pom.xml saya semua konten di src / main / resources / static akhirnya muncul melalui browser:
Tampaknya spring-web / spring-webmvc adalah ketergantungan transitif penting yang membuat boot otomatis konfigurasi boot menyala.
sumber
FYI: Saya juga memperhatikan bahwa saya dapat mengacaukan aplikasi semi boot yang berfungsi dengan baik dan mencegahnya menyajikan konten dari folder statis, jika saya menambahkan pengendali istirahat yang buruk seperti itu.
Dalam contoh ini, setelah menambahkan pengontrol buruk ke proyek, ketika browser meminta file yang tersedia di folder statis, respons kesalahan adalah ' 405 Metode Tidak Diizinkan '.
Jalur pemberitahuan tidak dipetakan dalam contoh pengontrol buruk.
sumber
Saya menghadapi masalah yang sama di spring boot 2.1.3 yang mengatakan bahwa sumber daya tidak ditemukan 404. Saya menghapus di bawah ini dari applicatiion.properties .
Dihapus @enableWebMVC dan menghapus pengesampingan WebMvcConfigurer apa pun
Pastikan juga Anda memiliki @EnableAutoConfiguration di konfigurasi Anda.
Dan letakkan semua sumber daya statis ke src / main / resources / statis dan itu hanya bekerja seperti sulap akhirnya ..
sumber
menggunakan spring boot 2. *, saya memiliki pengontrol yang memetakan ke rute
GetMapping({"/{var}", "/{var1}/{var2}", "/{var1}/{var2}/{var3}"})
dan membuat aplikasi saya berhenti melayani sumber daya.saya tahu itu tidak disarankan untuk memiliki rute seperti itu tetapi semuanya tergantung pada aplikasi yang sedang Anda buat (dalam kasus saya, saya tidak punya pilihan selain memiliki rute seperti itu)
jadi inilah hack saya untuk memastikan aplikasi saya menyajikan sumber daya lagi. Saya hanya memiliki pengontrol yang memetakan ke sumber daya saya. sejak musim semi akan mencocokkan rute langsung terlebih dahulu sebelum yang memiliki variabel, saya memutuskan untuk menambahkan metode pengontrol yang memetakan
/imgaes/{name}
dan diulang sama untuk sumber daya lainnyadan ini memecahkan masalah saya
sumber
Punya masalah yang sama, menggunakan gradle dan gerhana dan menghabiskan berjam-jam mencoba mencari tahu.
Tidak diperlukan pengkodean, masalahnya adalah Anda harus menggunakan opsi menu New-> Source Folder (BUKAN New -> Folder) untuk membuat folder statis di bawah src / main / resources. Tidak tahu mengapa ini bekerja, tetapi apakah baru -> folder sumber kemudian saya beri nama folder statis (kemudian dialog folder sumber memberikan kesalahan yang harus Anda periksa: Perbarui filter pengecualian di folder sumber lain untuk memecahkan masalah bersarang). Folder statis baru saya, saya menambahkan index.html dan sekarang berfungsi.
sumber
Yah kadang-kadang layak untuk memeriksa apakah Anda menimpa pemetaan global oleh beberapa pengontrol lainnya. Contoh kesalahan sederhana (kotlin):
Dalam kasus di atas, Anda akan dapatkan ketika Anda meminta sumber daya statis:
Alasan untuk itu bisa jadi Anda ingin untuk memetakan
@PostMapping
ke/foo
tapi lupa tentang@RequestMapping
penjelasan pada@RestController
tingkat. Dalam hal ini semua permintaan dipetakan kePOST
dan Anda tidak akan menerima konten statis dalam kasus ini.sumber
Sumber daya yang diberikan di bawah src / main / resources / static, jika Anda menambahkan kode ini, maka semua konten statis dari src / main / resources / static akan tersedia di bawah "/":
sumber
Dalam kasus saya, beberapa file statis tidak dilayani, seperti font .woff dan beberapa gambar. Tapi css dan js bekerja dengan baik.
Pembaruan: Solusi yang jauh lebih baik untuk membuat Spring Boot menyajikan font woff dengan benar adalah dengan mengkonfigurasi pemfilteran sumber daya yang disebutkan dalam jawaban ini , misalnya (perhatikan bahwa Anda memerlukan keduanya termasuk dan tidak termasuk):
----- Solusi lama (berfungsi tetapi akan merusak beberapa font) -----
Solusi lain adalah dengan menonaktifkan pencocokan pola sufiks
setUseSuffixPatternMatch(false)
Kredit: @Abhiji menunjuk saya dengan 4. ke arah yang benar!
sumber
Permintaan ke / ** dievaluasi ke lokasi statis yang dikonfigurasi di resourceProperties .
menambahkan yang berikut pada application.properties, mungkin satu-satunya hal yang perlu Anda lakukan ...
ini akan menimpa lokasi statis default, yang adalah:
Anda mungkin tidak ingin melakukan itu dan pastikan sumber daya Anda berakhir di salah satu folder default itu.
Melakukan permintaan: Jika saya ingin example.html disimpan di /public/example.html Maka saya dapat mengaksesnya seperti ini:
Jika saya ingin uri lain suka
<host>/<context-path>/magico/*
untuk file di classpath: / magicofiles / * Anda perlu konfigurasi yang lebih sedikitsumber
Seperti dikatakan di atas, file harus dalam
$ClassPath/static/images/name.png
, (/ static atau / public atau / resources atau / META-INF / resources). $ ClassPath ini berartimain/resources
ataumain/java
dir.Jika file Anda tidak dalam dir standar, Anda dapat menambahkan konfigurasi berikut:
}
sumber