Spring Boot tidak menayangkan konten statis

173

Saya tidak bisa mendapatkan proyek Spring-boot untuk menyajikan konten statis.

Saya telah menempatkan folder dengan nama di staticbawah 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, resourcesdan META-INF/resourcestapi 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.pngmisalnya, tetapi memanggil :, yang http://localhost:8080/images/head.pngsaya dapatkan hanyalah404

Adakah ide mengapa spring-boot tidak menemukan ini? (Saya menggunakan 1.1.4 BTW)

Vinicius Carvalho
sumber
6
Sumber daya penanganan peta default ke / **. Saya akan memeriksa ulang apakah itu diaktifkan. Jika ya, Anda akan melihat baris yang diakhiri dengan "Jalur URL yang dipetakan [/ **] pada tipe handler [kelas org.springframework.web.servlet.resource.ResourceHttpRequestHandler]" di output ketika Anda memulai aplikasi Anda. Kemungkinan lain adalah pengontrol Anda sendiri yang juga dipetakan ke / ** dan diutamakan di atas handler sumber daya. Memposting output dari startup aplikasi Anda akan memudahkan kami untuk melihat apa yang terjadi.
Andy Wilkinson
12
Saya kira Anda memiliki @EnableWebMvc(atau setara) di aplikasi Anda. Itu akan mematikan konfigurasi Boot MVC default.
Dave Syer
1
Tidak, saya tidak punya @EnableWebMvc di mana pun. Saya tidak mengerti. Sekarang ini terjadi dengan template juga. Semua templat saya (freemarker) ditemukan oleh classloader spring boot.
Vinicius Carvalho
2
Saya mengalami masalah serupa dan tidak beruntung dengan resolusi yang disarankan yang disediakan. Jika seseorang bisa begitu baik untuk melihat dan menunjukkan apa yang saya lakukan salah itu akan sangat dihargai !!! github.com/kylebober/kbss
Kyle S. Bober
3
Saya menemukan bahwa jika saya memiliki file src / main / resources / public / style.css, maka url untuk itu adalah /style.css dan bukan /public/style.css seperti yang saya harapkan.
Dave

Jawaban:

179

Bukan untuk membangkitkan orang mati setelah lebih dari setahun, tetapi semua jawaban sebelumnya kehilangan beberapa poin penting:

  1. @EnableWebMvcdi kelas Anda akan menonaktifkan org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration. Tidak apa-apa jika Anda ingin kontrol penuh tetapi sebaliknya, itu masalah.
  2. 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.ResourcePropertiesdari v1.3.0.RELEASE, saya melihat bidang staticLocationsyang dapat dikonfigurasi di application.properties. Berikut cuplikan dari sumber:

    /**
     * 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. Seperti disebutkan sebelumnya, URL permintaan akan diselesaikan relatif terhadap lokasi-lokasi ini. Dengan demikian src/main/resources/static/index.htmlakan disajikan ketika URL permintaan /index.html. Kelas yang bertanggung jawab untuk menyelesaikan jalur, pada Spring 4.1, adalah org.springframework.web.servlet.resource.PathResourceResolver.

  4. 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, perluas WebMvcConfigurerAdapter(tapi jangan gunakan @EnableWebMvc) dan ganti configurePathMatchseperti yang ditunjukkan di bawah ini:

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

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.

Abhijit Sarkar
sumber
3
jawaban ini memang setelah banyak penelitian. Yang bagus untuk dibaca
Ekansh Rastogi
2
Jika saya sangat penting saya akan mengambil jawaban ini dan memasukkannya ke dalam dokumentasi Boot Musim Semi
aliopi
2
@Abhijit Sarkar yang saya maksud adalah perusahaan Pivotal , maaf atas perasaan buruk, tetapi itu tidak dimaksudkan. Pivotal adalah pemilik Spring jika saya benar. Saya bisa mendokumentasikannya, tetapi mereka memiliki orang yang dibayar untuk ini, jadi mereka harus melakukannya: P
aliopi
1
@aliopi Spring adalah proyek sumber terbuka.
Abhijit Sarkar
3
satu-satunya cara untuk memiliki lebih sedikit bug dalam kode Anda adalah tidak menulis kode [...] sangat suka ini.
Clijsters
78

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:

@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
sumber
3
Saya memiliki masalah yang sama, versi Spring Boot yang sama tetapi ini juga tidak berhasil bagi saya
greyfox
Atasi masalah saya di versi 1.2.5 !! terima kasih banyak .. beri suara ini !!
mrclrchtr
Peretasan ini berfungsi ... aneh bahwa konfigurasi otomatis gagal
Allan Vital
Sayangnya, hack ini tidak bekerja untuk saya yang memalukan karena keanggunan. Saya tidak yakin apakah akar penyebabnya adalah jalur menuju sumber daya. Mungkin, karena saya menjalankannya di windows, mereka perlu diformat berbeda?
acarlstein
50

Saya memiliki masalah yang sama, dan ternyata solusi sederhana adalah memperpanjang kelas konfigurasi saya WebMvcAutoConfiguration:

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

Saya tidak memerlukan kode lain untuk memungkinkan konten statis saya untuk dilayani, namun, saya meletakkan direktori yang disebut di publicbawah src/main/webappdan mengkonfigurasi pakar untuk menunjuk src/main/webappsebagai direktori sumber daya. Ini berarti bahwa publicdisalin ke target/classes, dan karena itu ada di classpath saat runtime untuk menemukan spring-boot / tomcat.

Insinyur Perangkat Lunak
sumber
Dengan cara ini sumber daya statis tidak berfungsi di profil lain. misalnya saya memiliki profil untuk rilis yang menggunakan alamat IP lain. Saya mendapatkan 404 kesalahan untuk semua sumber daya saya.
Mahdi
24

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 @RestControllerpengontrol beranotasi yang saya lupa anotasi dengan @RequestMappinganotasi. Saya kira jalur yang dipetakan ini default ke "/" dan memblokir pemetaan sumber daya konten statis.

Johannes
sumber
1
Memecahkannya untukku! Saya punya controller beranotasi dengan @RestController ("/ blubb") yang jelas salah, tapi kadang-kadang Anda tidak melihat kayu untuk pohon-pohon. Mengubahnya ke @RestController @RequestMapping ("/ blubb") menyelesaikannya
krinklesaurus
Saya senang itu membantu, dan terhibur oleh gagasan bahwa ungkapan "Tidak bisa melihat hutan untuk semua pohon" ada di Jerman dan Swedia :)
Johannes
2
Anda juga dapat secara eksplisit menambahkan @RequestMapping ("/") jika tujuannya adalah untuk menayangkan konten statis dan memiliki penangan dinamis untuk permintaan root.
mjj1409
1
Wow .... Menghabiskan 2 hari yang sia-sia untuk yang satu ini. Aplikasi spring boot mvc saya menggunakan keamanan pegas dan tidak melihat file styles.css. Saya percaya keamanan tidak mengizinkan .jsp untuk mengakses file styles.css. Saya memiliki @RequestMapping ({"", "/", "/ home"}) di controller saya. Mengambil "" dan "/" dan MVC saya mulai bekerja dengan sempurna ... Sangat Aneh.
skmansfield
3
@Shafiul Tidak Menambahkan EnableAutoConfiguration dan SpringBootApplication berlebihan! "@SpringBootApplication" berisi "@EnableAutoConfiguration"
Dehan de Croos
19

Konfigurasi dapat dibuat sebagai berikut:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcAutoConfigurationAdapter {

// specific project configuration

}

Penting di sini adalah bahwa Anda WebMvcConfig mungkin menimpa addResourceHandlersmetode dan karena itu Anda perlu secara eksplisit memanggil super.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, /resourcesdan /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/imagesnama image.jpgmisalnya, 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).

Francisco Spaeth
sumber
Mungkin penting untuk berkomentar bahwa meskipun Anda / bisa / mengesampingkan addResourceHandlers, Anda sebenarnya tidak perlu untuk menyelesaikan masalah OP.
Insinyur Perangkat Lunak
@EngineerDollery terima kasih atas komentarnya, itu maksud saya, tetapi saya secara eksplisit menambahkan penjelasannya
Francisco Spaeth
Saya memindahkan css / js saya ke folder src / main / resources / static dan kesalahannya tidak ada lagi, tetapi saya masih tidak dapat menampilkan css di halaman saya.
Hatem Jaber
Bung, saya menjelajahi internet untuk menemukan solusi yang berfungsi ini. Tampaknya kuncinya adalah kombinasi @EnableWebMvcdan WebMvcAutoConfigurationAdapter. Terima kasih waktu besar!
Ian Newland
Bagi saya, itu juga tidak berhasil. Saya harus menambahkan ini juga. Saya hanya menambahkan komentar saya di sini karena saya punya dua masalah. Saya juga punya controller yang memetakan "/" seperti yang disebutkan @Johannes. Melakukan ini dan menghapus "/" controller saya menyelesaikan masalah saya.
loyalBrown
11

Apakah Anda memeriksa dokumen referensi Spring Boot ?

Secara default Spring Boot akan menyajikan konten statis dari folder bernama /static(atau /publicatau /resourcesatau /META-INF/resources) di classpath atau dari root ServletContext.

Anda juga dapat membandingkan proyek Anda dengan panduan Melayani Konten Web dengan Spring MVC , atau memeriksa kode sumber proyek spring-boot-sample-web-ui .

matsev
sumber
2
Ya saya lakukan, itu adalah tempat saya mencoba, seperti yang diperintahkan oleh dokter. Tapi tidak ada yang berhasil. Saya tidak mengerti mengapa sumber daya tidak ditemukan sama sekali. Saya sudah mencoba melihat sampel, anehnya tidak ada sampel yang menggunakan struktur yang diusulkan oleh dokumen. Yang baru saja Anda tempel menggunakan folder templat, saya berasumsi itu untuk konfigurasi thymeleaf atau kecepatan.
Vinicius Carvalho
Sampel Web UI ( github.com/spring-projects/spring-boot/tree/v1.1.3.RELEASE/… ) menyajikan konten statis.
Andy Wilkinson
Saya setuju dengan @ViniciusCarvalho, saya telah mencoba setiap kombinasi yang mungkin untuk mendapatkan css / js di tempat yang tepat dan sepertinya tidak bisa melakukan itu. Bahkan jika saya mengunjungi localhost: 8089 / css / styles.css saya tidak melihat apa pun. Saya hanya punya satu aturan untuk mengubah warna tubuh.
Hatem Jaber
10

Saya mengalami masalah yang tepat ini, kemudian menyadari bahwa saya telah mendefinisikan di application.properties saya:

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

Yang mengesampingkan semua yang telah saya coba. Dalam kasus saya, saya ingin menyimpan keduanya, jadi saya hanya menyimpan properti dan menambahkan:

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

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.

S. Jacob Powell
sumber
Saya menggunakan Spring Boot 2.0.5.RELEASE dan memasukkan spring.resources.static-locations=file:/var/www/static,classpath:staticke dalam properti application.prop saya, tetapi itu tidak berhasil untuk saya. Saya menggunakan @EnableWebMvckelas konfigurasi saya.
N. Ngo
Inilah yang memecahkan masalah saya. bersama dengan security.ignoreddansecurity.publicPaths
JoSSte
5

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.

@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
    }
.....
}
Remus
sumber
5

Hanya dengan menambahkan jawaban lain untuk pertanyaan lama ... Orang-orang telah menyebutkan surat @EnableWebMvcwasiat untuk mencegah WebMvcAutoConfigurationpemuatan, yang merupakan kode yang bertanggung jawab untuk menciptakan penangan sumber daya statis. Ada kondisi lain yang akan mencegah WebMvcAutoConfigurationdari 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 WebMvcConfigurationSupportyang merupakan kondisi yang akan mencegah konfigurasi otomatis:

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

Sangat penting untuk tidak pernah memperpanjang WebMvcConfigurationSupport. Sebaliknya, perluas dari WebMvcConfigurerAdapter.

PEMBARUAN: Cara yang tepat untuk melakukan ini dalam 5.x adalah dengan mengimplementasikan WebMvcConfigurer

Bal
sumber
WebMvcConfigurerAdapter sudah tidak digunakan lagi pada Spring Boot 5.0. Googling ternyata ini di Javadocs untuk kelas itu: "sejak 5.0 WebMvcConfigurer memiliki metode default (dimungkinkan oleh baseline Java 8) dan dapat diimplementasikan secara langsung tanpa memerlukan adaptor ini." Jadi saya pikir seseorang mengimplementasikan WebMvcConfigurer sekarang.
Marvo
@Marvo itu benar sekali. Cara yang tepat untuk melakukan ini dalam 5.x adalah dengan mengimplementasikan WebMvcConfigurer.
Bal
4

Solusi ini bekerja untuk saya:

Pertama, letakkan folder sumber daya di bawah webapp / WEB-INF, sebagai struktur ikuti

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

Kedua, dalam file konfigurasi musim semi

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

Kemudian, Anda dapat mengakses konten sumber daya Anda, seperti http: // localhost: 8080 / resource / image / yourimage.jpg

ldeng
sumber
3

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.

@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
sumber
Menghapus @EnableWebMvc melakukannya untuk saya! Terima kasih
turboemu
3

Masukkan sumber daya statis di bawah direktori:

/src/main/resources/static

tambahkan properti ini di file application.properties

server.servlet.context-path=/pdx

Anda dapat mengakses dari http: // localhost: 8080 / pdx / images / image.jpg

masukkan deskripsi gambar di sini

dasunse
sumber
1
Saya tidak tahu bagaimana mengatakannya. Terima kasih . Saudaraku hebat. Saya mencoba hampir semua solusi di atas tetapi ini adalah yang terbaik dan terpendek.
user12061795
2

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 :

Jika Anda menggunakan Maven, jalankan:

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

Bagian penting yang menambahkan packagetujuan untuk dijalankan sebelum aplikasi sebenarnya dimulai. (Ide: Runmenu, Edit Configrations..., Add, dan ada pilih Run Maven Goal, dan menentukan packagetujuan di lapangan)

ppeterka
sumber
1

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:

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

Tampaknya spring-web / spring-webmvc adalah ketergantungan transitif penting yang membuat boot otomatis konfigurasi boot menyala.

LilleElefant
sumber
1

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.

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

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.

Ganesha
sumber
1

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 .

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

Dihapus @enableWebMVC dan menghapus pengesampingan WebMvcConfigurer apa pun

// @ EnableWebMvc

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

Debadatta
sumber
versi semi saya di 2.2.6 dan saya memiliki @EnableAutoConfiguration dan file di bawah src / main / resources / statis tetapi tidak berfungsi dan melempar 500.
shivani thakur
1

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 lainnya

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

dan ini memecahkan masalah saya

Hujan
sumber
0

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.

Vizcaino
sumber
0

Yah kadang-kadang layak untuk memeriksa apakah Anda menimpa pemetaan global oleh beberapa pengontrol lainnya. Contoh kesalahan sederhana (kotlin):

@RestController("/foo")
class TrainingController {

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

}

Dalam kasus di atas, Anda akan dapatkan ketika Anda meminta sumber daya statis:

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

Alasan untuk itu bisa jadi Anda ingin untuk memetakan @PostMappingke /footapi lupa tentang @RequestMappingpenjelasan pada @RestControllertingkat. Dalam hal ini semua permintaan dipetakan ke POSTdan Anda tidak akan menerima konten statis dalam kasus ini.

Przemek Nowak
sumber
0

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 "/":

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

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):

<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>

----- Solusi lama (berfungsi tetapi akan merusak beberapa font) -----

Solusi lain adalah dengan menonaktifkan pencocokan pola sufiks 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);
    }
}

Kredit: @Abhiji menunjuk saya dengan 4. ke arah yang benar!

LukeSolar
sumber
0

Permintaan ke / ** dievaluasi ke lokasi statis yang dikonfigurasi di resourceProperties .

menambahkan yang berikut pada application.properties, mungkin satu-satunya hal yang perlu Anda lakukan ...

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

ini akan menimpa lokasi statis default, yang adalah:

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

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:

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

Jika saya ingin uri lain suka <host>/<context-path>/magico/*untuk file di classpath: / magicofiles / * Anda perlu konfigurasi yang lebih sedikit

@Configuration
class MyConfigClass implements WebMvcConfigurer

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/magico/**").addResourceLocations("/magicofiles/");
}
Sven Dhaens
sumber
-1

Seperti dikatakan di atas, file harus dalam $ClassPath/static/images/name.png, (/ static atau / public atau / resources atau / META-INF / resources). $ ClassPath ini berarti main/resourcesatau main/javadir.

Jika file Anda tidak dalam dir standar, Anda dapat menambahkan konfigurasi berikut:

@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
sumber