Spring Boot statik içerik sunmuyor


173

Spring-boot projemi statik içerik sunmak için alamıyorum.

staticAltında bir klasör yerleştirdim src/main/resources. İçinde bir klasör var images. Uygulamayı paketleyip çalıştırdığımda, o klasöre koyduğum görüntüleri bulamıyor.

Ben statik dosyaları koymak için denedim public, resourcesve META-INF/resourcesama hiçbir şey çalışır.

-Tvf app.jar jar Eğer dosyaları doğru klasördeki kavanoz içinde görebilirsiniz: /static/images/head.pngörneğin, ama arama:, http://localhost:8080/images/head.pngtüm aldığım bir404

Spring-Boot'un neden bulamadığı hakkında bir fikrin var mı? (1.1.4 BTW kullanıyorum)


6
Varsayılan kaynak işleme / ** ile eşleşir. Etkin olup olmadığını iki kez kontrol ederim. Öyleyse, uygulamanızı başlattığınızda çıktıda "class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]" işleyicisine "Eşlenen URL yolu [/ **] ile biten bir satır görürsünüz. Başka bir olasılık da / ** ile eşlenen ve kaynak işleyicisine göre öncelikli olan kendi denetleyicinizdir. Uygulamanızın başlangıcını göndermek, neler olduğunu görmemizi kolaylaştıracaktır.
Andy Wilkinson

12
@EnableWebMvcUygulamanızda (veya eşdeğeri) olduğunu tahmin ediyorum . Bu, varsayılan Önyükleme MVC yapılandırmasını kapatır.
Dave Syer

1
Hayır, hiçbir yerde @EnableWebMvc yok. Bunu anlamıyorum. Şimdi şablonlarla da oluyor. Şablonlarımdan herhangi biri (freemarker), bahar önyüklemesinin sınıf yükleyicisi tarafından bulundu.
Vinicius Carvalho

2
Ben benzer bir sorunla karşılaşıyorum ve sağlanan önerilen çözünürlüklerin herhangi bir şans vardı. Birisi bir göz atın ve tam olarak ne yanlış olduğunu işaret çok nazik olabilir, ben çok takdir edilecektir !!! github.com/kylebober/kbss
Kyle

3
Ben bir dosya src / main / resources / public / style.css varsa, o zaman url / style.css olduğunu / beklediğim gibi /public/style.css olduğunu buldum.
Dave

Yanıtlar:


179

Bir yıldan fazla bir süre sonra ölüleri yükseltmemek, ancak önceki tüm cevaplar bazı önemli noktaları kaçırıyor:

  1. @EnableWebMvcsınıfınızda devre dışı bırakılacaktır org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration. Tam kontrol istiyorsanız bu iyi bir şey, ancak aksi takdirde bir sorun var.
  2. Önceden sağlananlara ek olarak statik kaynaklar için başka bir konum eklemek için herhangi bir kod yazmanıza gerek yoktur. Baktığımızda org.springframework.boot.autoconfigure.web.ResourcePropertiesv1.3.0.RELEASE gelen, bir alanına bakın staticLocationsyapılandırılabilir application.properties. İşte kaynaktan bir pasaj:

    /**
     * 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. Daha önce de belirtildiği gibi, istek URL'si bu konumlara göre çözülecektir . Böylece src/main/resources/static/index.htmlistek URL'si olduğunda sunulacaktır /index.html. 4.1 Baharı'ndan itibaren yolu çözmekle sorumlu olan sınıftır org.springframework.web.servlet.resource.PathResourceResolver.

  4. Sonek kalıp eşleşmesi varsayılan olarak etkindir, yani bir istek URL'si için /index.html, Bahar karşılık gelen işleyicileri arayacaktır /index.html. Amaç statik içerik sunmaksa bu bir sorundur. Bunu devre dışı bırakmak için, aşağıda gösterildiği gibi genişletin WebMvcConfigurerAdapter(ancak kullanmayın @EnableWebMvc) ve geçersiz kılın configurePathMatch:

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

IMHO, kodunuzda daha az hata bulundurmanın tek yolu mümkün olduğunda kod yazmak değildir. Sağlananları kullanın, bu biraz araştırma gerektirse bile, geri dönüş buna değer.


3
bu cevap gerçekten çok araştırmadan sonra. Okumak için harika bir yer
Ekansh Rastogi

2
Eğer çok önemli olsaydım, bu cevabı alıp Spring Boot belgelerine
koyardım

2
@ Abhijit Sarkar Pivotal şirketini kastettim, kötü duygular için özür dilerim, ama amaçlanmamıştı. Doğru olduğumda Pivotal, Spring'in sahibidir.
Belgeleyebildim

1
@aliopi Spring açık kaynaklı bir projedir.
Abhijit Sarkar

3
kodunuzda daha az hataya sahip olmanın tek yolu kodu [...] bu şekilde yazmak değildir .
Clijsters

78

Spring-boot durumundan farklı olarak, içeriğe hizmet etmek için spring-boot kavanozumu almak için: Özellikle bu yapılandırma sınıfından src / main / resources / static içeriğimi kaydettirmek zorunda kaldım:

@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
Ben aynı sorunu, Bahar Boot aynı sürümü var ama bu benim için de işe yaramadı
greyfox

1.2.5 sürümünde sorunum düzeltildi! çok teşekkür ederim .. oy verin !!
mrclrchtr

Bu kesmek işe yarıyor ... otomatik yapılandırmanın başarısız olması tuhaf
Allan Vital

Ne yazık ki, bu kesmek benim için işe yaramıyor, bu da zarafet nedeniyle bir utanç. Kök neden kaynağın yolları olup olmadığından emin değilim. Belki de pencerelerde çalıştırdığım için farklı biçimlendirilmeleri gerekir?
acarlstein

50

Benzer bir sorun vardı ve basit çözüm yapılandırma sınıfımı genişletmek olduğu ortaya çıktı WebMvcAutoConfiguration:

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

Statik içeriğimin sunulmasına izin vermek için başka bir koda ihtiyacım yoktu, ancak publicaltında bir dizin koydum src/main/webappve src/main/webappbir kaynak dizini olarak işaret edecek maven'i yapılandırdım . Bu public, kopyalanacağı anlamına gelir target/classesve bu nedenle, bahar önyükleme / tomcat'in bulması için çalışma zamanında sınıfyolundadır.


Bu şekilde statik kaynaklar başka bir profilde çalışmaz. örneğin başka bir IP adresi kullanan bir sürümüm var. Tüm kaynaklarım için 404 hatası alıyorum.
Mehdi

24

"/" İle eşlenmiş veya eşlenmiş bir yol olmayan Denetleyiciler arayın.

Bunun gibi bir sorunum vardı, 405 hata alıyorum ve günlerce kafamı zorladım. Sorun @RestController, bir @RequestMappingek açıklama ile ek açıklama eklemeyi unuttuğum açıklamalı bir denetleyici olduğu ortaya çıktı . Bu eşlenen yol varsayılan olarak "/" varsayılan ve statik içerik kaynak eşleme engelledi sanırım.


1
Benim için çözdüm! Açıkçası yanlış @RestController ("/ blubb") ile açıklamalı bir denetleyici vardı, ama bazen ağaçlar için odun görmüyorum. @RestController @RequestMapping ("/ blubb") olarak değiştirmek bunu çözdü
krinklesaurus

Yardımcı oldu ve "Tüm ağaçlar için orman göremiyorum" ifadesi Almanca yanı sıra İsveççe var olduğu fikrini eğlendirdi sevindim :)
Johannes

2
Ayrıca, amaç hem statik içerik sunmak hem de kök istekleri için dinamik bir işleyici kullanmaksa @RequestMapping ("/") öğesini açıkça ekleyebilirsiniz.
mjj1409

1
Vay be .... Bu bir 2 gün harcadı. Benim bahar önyükleme mvc uygulama bahar güvenliği kullanır ve styles.css dosyasını görmüyordu. Güvenlik .jsp's styles.css dosyasına erişmek için izin vermediğini düşünüyorum. Denetleyicimde bir @RequestMapping ({"", "/", "/ home"}) vardı. "" Ve "/" çıktı ve MVC mükemmel çalışmaya başladı ... Çok Garip.
skmansfield

3
@Shafiul Hayır Hem EnableAutoConfiguration hem de SpringBootApplication eklemek gereksizdir! "@SpringBootApplication", "@EnableAutoConfiguration" içeriyor
Dehan de Croos

19

Yapılandırma aşağıdaki gibi yapılabilir:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcAutoConfigurationAdapter {

// specific project configuration

}

Burada Önemli olmasıdır WebMvcConfig Mayıs geçersiz kılma addResourceHandlersyöntemi ve bu nedenle ihtiyaç açıkça çağırmak için super.addResourceHandlers(registry)(o varsayılan kaynak yerleri memnun olup olmadığını, herhangi bir yöntemi geçersiz gerekmez doğrudur).

İhtiyaçları burada yorumladı edilecek bir diğer şey ise bu varsayılan kaynak yerleri (yani /static, /public, /resourcesve /META-INF/resourceszaten eşleştirilmiş bir kaynak işleyicisi yoksa) sadece kayıtlı edilecektir /**.

Bu andan itibaren, örneğin src/main/resources/static/imagesadında bir resminiz varsa image.jpg, aşağıdaki URL'yi kullanarak ona erişebilirsiniz: http://localhost:8080/images/image.jpg(sunucunun 8080 bağlantı noktasında başlatılması ve uygulamanın kök içeriğe dağıtılması).


AddResourceHandlers / siz / geçersiz kılmanıza rağmen, OP'nin sorununu çözmek için aslında gerekli olmamanıza yorum yapmak belki de önemlidir.
Yazılım Mühendisi

@EngineerDollery yorum için teşekkürler, bu benim niyetimdi ama açıklamayı açıkça ekledim
Francisco Spaeth

Css / js'imi src / main / resources / static klasörüne taşıdım ve hatalar artık orada değil, ancak yine de sayfamda css görüntülenmesini sağlayamıyorum.
Hatem Jaber

Dostum, bu çalışma çözümünü bulmak için internetin derinliklerini dolaştım. Görünüşe göre anahtar @EnableWebMvcve WebMvcAutoConfigurationAdapter. Teşekkürler büyük zaman!
Ian Newland

Benim için kutunun dışında da işe yaramadı. Bunu da eklemek zorunda kaldım. Yorumumu buraya ekliyorum çünkü iki problemim vardı. Ayrıca "/" @Johannes'ın belirttiği gibi eşleyen bir denetleyicim vardı. Bunu yapmak ve "/" denetleyicimi kaldırmak sorunlarımı çözdü.
loyalBrown

11

Spring Boot referans belgelerini kontrol ettiniz mi?

Varsayılan olarak Spring Boot , sınıf yolunda /static(veya /publicveya /resourcesveya /META-INF/resources) adlı bir klasörden veya ServletContext kökünden statik içerik sunar.

Projenizi Spring MVC ile Web İçeriği Sunma kılavuzu ile karşılaştırabilir veya spring-boot-sample-web-ui projesinin kaynak kodunu kontrol edebilirsiniz .


2
Evet yaptım, tıpkı dokümanlar tarafından söylendiği gibi, denediğim yerler bunlar. Ama hiçbir şey işe yaramıyor. Kaynağın neden bulunmadığını anlamıyorum. Örneklere bakmaya çalıştım, garip bir şekilde dokümanlar tarafından önerilen yapıyı kullanan hiçbir örnek yok. Yapıştırdığınız bir şablonlar klasörü kullanıyor, bunun kekik bir yapılandırma veya hız için olduğunu varsayıyorum.
Vinicius Carvalho

Web kullanıcı arayüzü örneği ( github.com/spring-projects/spring-boot/tree/v1.1.3.RELEASE/… ) statik içerik sunar.
Andy Wilkinson

@ViniciusCarvalho ile hemfikirim, doğru yerde css / js almak için mümkün olan her kombinasyonu denedim ve bunu yapamıyorum. Localhost'u ziyaret etsem bile: 8089 / css / styles.css hiçbir şey görmüyorum. Gövde rengini değiştirmek için sadece bir kuralım var.
Hatem Jaber

10

Ben tam olarak bu sorunu yaşıyordu, sonra benim application.properties tanımladı fark etti:

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

Hangi denedim her şeyi geçersiz kıldı. Benim durumumda, her ikisini de tutmak istedim, bu yüzden sadece mülkü sakladım ve ekledim:

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

Src / main / resources / static dosyasından localhost olarak sunulan dosyalar: {port} /file.html.

Yukarıdakilerin hiçbiri benim için işe yaramadı çünkü kimse, farklı bir amaca hizmet etmek için çevrimiçi olarak kolayca kopyalanabilecek bu küçük mülkten bahsetmedi;)

Umarım yardımcı olur! Bu sorunu olan insanlar için bu uzun cevap sonrası için uygun olacağını düşündüm.


Spring Boot 2.0.5 kullanıyorum. BÜLTEN ve spring.resources.static-locations=file:/var/www/static,classpath:staticbenim application.properties koyarak , ama benim için çalışmadı. Ben kullanıyorum @EnableWebMvcbenim yapılandırma sınıfı.
N. Ngo

Sorunumu çözen buydu. boyunca birlikte security.ignoredvesecurity.publicPaths
JoSSte

5

Önceki cevapların konuyu çok iyi ele aldığını düşünüyorum. Ancak, bir durumda uygulamanızda Spring Security'yi etkinleştirdiğinizde, Spring'e özellikle "/ static / fonts" gibi diğer statik kaynak dizinlerine yönelik isteklere izin vermesini söylemeniz gerekebileceğini de ekleyebilirim .

Benim durumumda varsayılan olarak izin verilen "/ static / css", "/ static / js", "/ static / images" vardı, ancak / static / fonts / **, Spring Security uygulamam tarafından engellendi.

Aşağıda bunu nasıl düzelttiğime bir örnek verilmiştir.

@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

Eski bir soruya başka bir cevap daha eklemek için ... İnsanlar statik kaynak işleyicilerini oluşturmaktan sorumlu olan kod yüklenmesini @EnableWebMvcönleyeceklerini belirttiler WebMvcAutoConfiguration. Yüklenmeyi de engelleyecek başka koşullar WebMvcAutoConfigurationda var. Bunu görmenin en açık yolu kaynağa bakmaktır:

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

Benim durumumda, WebMvcConfigurationSupportotomatik yapılandırmayı önleyecek bir koşul olan genişleyen bir sınıfa sahip bir kütüphane ekliyordum:

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

Asla uzanmamak önemlidir WebMvcConfigurationSupport. Bunun yerine, genişletin WebMvcConfigurerAdapter.

GÜNCELLEME: 5.x içinde bunu yapmanın uygun yolu WebMvcConfigurer uygulamaktır


WebMvcConfigurerAdapter, Spring Boot 5.0'dan itibaren kullanımdan kaldırılmıştır. Googling bunu bu sınıf için Javadocs'ta açar: "5.0 sürümünden itibaren WebMvcConfigurer varsayılan yöntemlere sahiptir (Java 8 taban çizgisi tarafından mümkün kılınmıştır) ve bu adaptöre gerek kalmadan doğrudan uygulanabilir." Ben So düşünüyorum artık tek uygular WebMvcConfigurer.
Marvo

@Marvo tam olarak doğru. 5.x 'de bunu yapmanın doğru yolu uygulamaktır WebMvcConfigurer.
Bal

4

Bu çözüm benim için çalışıyor:

İlk olarak, webapp / WEB-INF altına bir kaynak klasörü aşağıdaki yapı olarak yerleştirin

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

İkinci olarak, yay yapılandırma dosyasında

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

Ardından, http: // localhost: 8080 / resource / image / yourimage.jpg gibi kaynak içeriğinize erişebilirsiniz.


3

Dikkate alınması gereken 2 şey var (Spring Boot v1.5.2.RELEASE) - 1) Tüm Kontrolör sınıflarını @EnableWebMvc ek açıklaması için kontrol edin, varsa kaldırın 2) Ek açıklamanın kullanıldığı Kontrolör sınıflarını kontrol edin - @RestController veya @Controller . Rest API ve MVC davranışlarını bir sınıfta karıştırmayın. MVC için @Controller ve REST API için @RestController kullanın

2'den fazla şey yapmak sorunumu çözdü. Şimdi benim bahar çizme herhangi bir sorun olmadan statik kaynakları yükleniyor. @Controller => load index.html => statik dosyaları yükler.

@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 kaldırmak benim için yaptı! Thank you
turboemu


2

Bir IDE içinden uygulamayı başlatırken (yani Eclipse veya IntelliJ Idea'dan başlayarak) ve Maven'i kullanırken sorunun ortaya çıkması durumunda, çözümün anahtarı Spring-boot Başlangıç belgelerinde:

Maven kullanıyorsanız, yürütün:

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

Bunun önemli kısmı package, uygulama başlamadan önce çalıştırılacak hedefi eklemektir . (Fikir: RunMenü, Edit Configrations..., Add, ve orada seçmek Run Maven Goalve belirtmek packagealanda gol)


1

1.3.5 kullanıyorum ve Jersey uygulamasıyla bir grup REST hizmetine ev sahipliği yapıyorum. Birkaç HTML + js dosyası eklemeye karar verene kadar bu iyi çalıştı. Bu forumda verilen cevapların hiçbiri bana yardımcı olmadı. Ancak, pom.xml dosyama aşağıdaki bağımlılığı eklediğimde src / main / resources / static içindeki tüm içerik nihayet tarayıcı aracılığıyla gösteriliyordu:

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

Spring-web / spring-webmvc, bahar önyükleme otomatik yapılandırmasını etkinleştiren önemli geçişli bağımlılık gibi görünüyor.


1

FYI: Ayrıca, mükemmel çalışan bir bahar önyükleme uygulamasını bozabileceğimi ve statik klasörden içerik sunmasını engelleyebileceğimi fark ettim, eğer böyle kötü bir dinlenme denetleyicisi eklersem

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

Bu örnekte, kötü denetleyiciyi projeye ekledikten sonra, tarayıcı statik klasörde bulunan bir dosya istediğinde, hata yanıtı ' 405 Yönteme İzin Verilmez ' şeklindedir.

Uyarı yolları, kötü denetleyici örneğinde eşlenmiyor.


1

Aynı sorun, kaynak önyükleme 2.1.3 kaynak 404 bulunamadı diyerek karşı karşıya idi . Aşağıda applicatiion.properties kaldırıldı .

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

@EnableWebMVC kaldırıldı ve tüm WebMvcConfigurer geçersiz kılmaları kaldırıldı

// @ EnableWebMvc

Ayrıca, yapılandırmanızda @EnableAutoConfiguration .

Ve tüm statik kaynakları src / main / resources / static'e koyun ve sonunda sihir gibi çalıştı.


2.2.6 benim bahar sürümü ve src / main / resources / static altında @EnableAutoConfiguration ve dosyaları var ama çalışmıyor ve 500 atar.
shivani thakur

1

bahar önyükleme 2 kullanarak. *, ben rotaları eşleştiren GetMapping({"/{var}", "/{var1}/{var2}", "/{var1}/{var2}/{var3}"})ve benim app durdurmak kaynakları sunan patlama bir denetleyici var .

biliyorum bu tür yollar olması tavsiye edilmez ama hepsi inşa ettiğiniz uygulamaya bağlıdır (benim durumumda, bu tür rotalara sahip olmaktan başka seçeneğim yok)

Bu yüzden benim app tekrar kaynakları sunmak emin olmak için benim kesmek. Sadece kaynaklarımla eşleşen bir denetleyicim var. Bahar, değişken olanlardan önce doğrudan doğrudan bir yolla eşleşeceğinden /imgaes/{name}, diğer kaynaklarla eşleşen ve aynı kaynak için tekrarlanan bir denetleyici yöntemi eklemeye karar verdim

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

ve bu benim sorunumu çözdü


0

Aynı sorun vardı, çakıl ve tutulma kullanarak ve anlamaya çalışırken saatlerce harcadı.

Kodlama gerekmez, hile, src / main / resources altında statik klasör oluşturmak için New-> Source Folder (Yeni değil -> Klasör) menü seçeneğini kullanmanızdır. Neden işe yaradığını bilmiyorum, ama yeni -> kaynak klasör sonra statik klasörü adlandırdı (sonra kaynak klasör iletişim için kontrol etmeniz gereken bir hata verir: İç içe geçmiş çözmek için diğer kaynak klasörlerde dışlama filtreleri güncelleştirin). Benim yeni statik klasör index.html ekledim ve şimdi çalışıyor.


0

Bazı kontrol denetleyicileri tarafından global eşleştirmeleri geçersiz kıldınız mı, bazen kontrol etmeye değer. Basit örnek hata (kotlin):

@RestController("/foo")
class TrainingController {

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

}

Yukarıdaki durumda statik kaynakları talep ettiğinizde elde edersiniz:

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

Bunun nedeni, haritaya @PostMappingeklemek istediğiniz , /fooancak düzeydeki @RequestMappingek açıklamaları unutmanız olabilir @RestController. Bu durumda, tüm istek eşlenir POSTve bu durumda statik içerik almazsınız.


0

Src / main / resources / static altındaki kaynaklar verildiğinde, bu kodu eklerseniz src / main / resources / static dizinindeki tüm statik içerik "/" altında kullanılabilir:

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

0

Benim durumumda, .woff yazı tipleri ve bazı resimler gibi bazı statik dosyalar sunulmadı. Ama css ve js gayet iyi çalıştı.

Güncelleme: Spring Boot'un woff yazı tiplerini doğru bir şekilde sunmasını sağlamak için çok daha iyi bir çözüm, bu cevapta belirtilen kaynak filtrelemeyi yapılandırmaktır, örneğin (hem dahil hem de hariç tutmanız gerektiğini unutmayın):

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

----- Eski çözüm (çalışıyor ancak bazı yazı tiplerini bozacak) -----

Başka bir çözüm, son ek deseni eşleşmesini devre dışı bırakmak 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);
    }
}

Kredi: @Abhiji bana doğru yönde 4 ile işaret etti!


0

/ ** istekleri resourceProperties'de yapılandırılan statik konumlara değerlendirilir .

application.properties üzerinde aşağıdaki ekleyerek, yapmanız gereken tek şey olabilir ...

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

bu, varsayılan statik konumların üzerine yazılır:

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

Bunu yapmak istemeyebilir ve kaynaklarınızın varsayılan klasörlerden birinde olduğundan emin olabilirsiniz.

Bir istekte bulunma: /public/example.html üzerinde depolanmış example.html olsaydı Bunu şu şekilde yapabilirim:

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

<host>/<context-path>/magico/*Classpath: / magicofiles / * dosyaları için başka bir uri istiyorum Eğer biraz daha yapılandırma gerekir

@Configuration
class MyConfigClass implements WebMvcConfigurer

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

-1

Yukarıda belirtildiği gibi dosya $ClassPath/static/images/name.png(/ static veya / public veya / resources veya / META-INF / resources) içinde olmalıdır. Bu $ ClassPath main/resourcesveyamain/java dir .

Dosyalarınız standart dizinlerde değilse, aşağıdaki yapılandırmayı ekleyebilirsiniz:

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

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.