स्प्रिंग बूट स्थिर सामग्री नहीं परोस रहा है


173

स्थिर सामग्री परोसने के लिए मुझे अपना स्प्रिंग-बूट प्रोजेक्ट नहीं मिल सकता है।

मैंने 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
डिफ़ॉल्ट संसाधन से निपटने के लिए नक्शे **। मैं दोबारा जांच करूंगा कि यह सक्षम है। यदि यह है, तो आपको एक पंक्ति दिखाई देगी जो "मैप्ड URL पथ [/ **] के साथ समाप्त होती है, जब आप अपना ऐप शुरू करते हैं, तो आउटपुट में [वर्ग org.springframework.web.servlet.resource.ResourceHttpRequestHandler" टाइप का हैंडलर। एक अन्य संभावना है कि आपका स्वयं का एक नियंत्रक है जो भी मैप किया जाता है / ** और संसाधन हैंडलर पर पूर्वता ले रहा है। आपके ऐप के स्टार्टअप के आउटपुट को पोस्ट करने से हमारे लिए यह देखना आसान हो जाएगा कि क्या हो रहा है।
एंडी विल्किंसन

12
मैं अनुमान लगा रहा हूं कि @EnableWebMvcआपके ऐप में (या समतुल्य) है। वह डिफॉल्ट बूट MVC कॉन्फिगरेशन को बंद कर देगा।
डेव सीर

1
नहीं, मेरे पास @EnableWebMvc कहीं भी नहीं है। मुझे यह नहीं मिलता। अब यह टेम्पलेट्स के साथ भी हो रहा है। मेरे किसी भी टेम्प्लेट (फ़्रीमार्क) को स्प्रिंग बूट के क्लास लोडर द्वारा पाया जा रहा है।
विनीसियस कार्वाल्हो

2
मैं इसी तरह के मुद्दे पर चल रहा हूं और मुझे प्रदान किए गए अनुशंसित प्रस्तावों में से कोई भी भाग्य नहीं है। अगर किसी को देखने के लिए इतना दयालु हो सकता है और यह इंगित कर सकता है कि यह मैं गलत कर रहा हूं तो यह बहुत सराहना की जाएगी !!! github.com/kylebober/kbss
काइल एस। बेबर

3
मैंने पाया कि अगर मेरे पास कोई फ़ाइल src / main / resource / 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, स्प्रिंग उसी के अनुरूप हैंडलर देखने जा रहा है /index.html। यह एक मुद्दा है अगर इरादा स्थिर सामग्री की सेवा करना है। उसे अक्षम करने के लिए, विस्तार करें WebMvcConfigurerAdapter(लेकिन उपयोग न करें @EnableWebMvc) और configurePathMatchनीचे दिखाए अनुसार ओवरराइड करें:

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

IMHO, आपके कोड में कम बग होने का एकमात्र तरीका कोड लिखना संभव नहीं है। जो पहले से ही प्रदान किया गया है, उसका उपयोग करें, भले ही वह कुछ शोध ले, वापसी इसके लायक है।


3
यह जवाब वास्तव में बहुत शोध के बाद है। पढ़ने के लिए एक महान
एकांश रस्तोगी

2
अगर मैं निर्णायक होता तो मैं इसका जवाब लेता और स्प्रिंग बूट डॉक्यूमेंट में डाल देता
अलोपी

2
@Abhijit सरकार मैं कंपनी का मतलब निर्णायक , किसी भी बुरी भावनाओं के लिए खेद है, लेकिन यह इरादा नहीं था। अगर मैं सही हूं तो पिवट वसंत का मालिक है। मैं इसे प्रलेखित कर सकता था, लेकिन उनके पास ऐसे लोग हैं जो इसके लिए भुगतान करते हैं, इसलिए उन्हें ऐसा करना चाहिए: पी
अलोपी

1
@ अलोपी स्प्रिंग एक ओपन सोर्स प्रोजेक्ट है।
अभिजीत सरकार

3
अपने कोड में कम बग होने का एकमात्र तरीका कोड लिखना नहीं है [...] वास्तव में यह पसंद है।
क्लिजस्टर्स

78

वसंत-बूट राज्यों के विपरीत, सामग्री की सेवा करने के लिए मेरा स्प्रिंग-बूट जार प्राप्त करने के लिए: मुझे विशेष रूप से इस config वर्ग के माध्यम से अपने src / main / resource / static सामग्री को पंजीकृत करना था:

@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
मेरे पास एक ही मुद्दा है, स्प्रिंग बूट का एक ही संस्करण, लेकिन यह मेरे लिए भी काम नहीं किया
greyfox

संस्करण 1.2.5 में मेरी समस्या तय हो गई !! बहुत बहुत धन्यवाद .. यह वोट !!
म्लेच्छचर

यह हैक काम करता है ... अजीब है कि ऑटो कॉन्फ़िगरेशन विफल रहता है
एलन वाइटल

अफसोस, यह हैक मेरे लिए काम नहीं करता है जो लालित्य के कारण शर्म की बात है। मुझे यकीन नहीं है कि अगर मूल कारण संसाधन का मार्ग है। शायद, जब से मैं इसे खिड़कियों में चला रहा हूं, उन्हें अलग तरीके से स्वरूपित करने की आवश्यकता है?
acarlstein

50

मुझे एक समान समस्या थी, और यह पता चला कि मेरे विन्यास वर्ग का विस्तार करने के लिए सरल समाधान था WebMvcAutoConfiguration:

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

मुझे अपनी स्थिर सामग्री को परोसने की अनुमति देने के लिए किसी अन्य कोड की आवश्यकता नहीं थी, हालांकि, मैंने एक निर्देशिका के publicतहत एक निर्देशिका नाम दिया src/main/webappऔर मावेन को src/main/webappएक संसाधन निर्देशिका के रूप में इंगित करने के लिए कॉन्फ़िगर किया । इसका मतलब है कि इसमें publicनकल की जाती है target/classes, और इसलिए इसे खोजने के लिए स्प्रिंग-बूट / टॉमकैट के लिए रनपथ पर क्लासपाथ पर है।


इस तरह से स्थिर संसाधन दूसरे प्रोफाइल में काम नहीं कर रहे हैं। उदाहरण के लिए मेरे पास रिलीज़ के लिए एक प्रोफ़ाइल है जो दूसरे आईपी पते का उपयोग करती है। मुझे अपने सभी संसाधनों के लिए 404 त्रुटि मिलती है।
महदी

24

"/" या बिना पथ मैप किए मैप किए गए नियंत्रकों की तलाश करें।

मुझे इस तरह की एक समस्या थी, 405 त्रुटियां हो रही थीं, और मेरे सिर को बहुत दिनों तक पीटा। समस्या एक @RestControllerएनोटेट नियंत्रक के रूप में सामने आई जिसे मैं @RequestMappingएनोटेशन के साथ एनोटेट करना भूल गया था । मुझे लगता है कि यह मैप किया गया पथ डिफ़ॉल्ट रूप से "/" पर है और स्थिर सामग्री संसाधन मैपिंग को अवरुद्ध कर दिया है।


1
यह मेरे लिए हल! मेरे पास @RestController ("/ blubb") के साथ एक नियंत्रक एनोटेट किया गया था, जो स्पष्ट रूप से गलत है, लेकिन किसी दिन आप पेड़ों के लिए लकड़ी नहीं देखते हैं। इसे बदलकर @RestController @RequestMapping ("/ blubb") ने इसे हल कर दिया
krinklesaurus

मुझे खुशी है कि इसने मदद की, और इस धारणा से चकित हूं कि अभिव्यक्ति "सभी पेड़ों के लिए जंगल नहीं देख सकता है" जर्मन के साथ-साथ स्वीडिश में भी मौजूद है :)
जोहान्स

2
आप स्पष्ट रूप से @RequestMapping ("/") जोड़ सकते हैं यदि इरादा स्थिर सामग्री की सेवा करने और रूट अनुरोधों के लिए एक गतिशील हैंडलर रखने का है।
mjj1409

1
वाह .... इस एक पर 2 दिन बर्बाद कर दिया। मेरा स्प्रिंग बूट mvc एप्लिकेशन स्प्रिंग सुरक्षा का उपयोग करता है और इसे style.css फ़ाइल नहीं देख रहा था। मेरा मानना ​​है कि सुरक्षा .jsp की style.css फ़ाइल तक पहुँचने की अनुमति नहीं दे रही थी। मेरे पास मेरे नियंत्रक में एक @RequestMapping ({"", "/", "/ घर"}) था। "" और "/" को लिया और मेरे MVC ने पूरी तरह से काम करना शुरू कर दिया ... बहुत अजीब।
स्केमन्सफ़ील्ड

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 पर शुरू हुआ और रूट संदर्भ में तैनात एप्लिकेशन)।


यह टिप्पणी करना संभवतः महत्वपूर्ण है कि यद्यपि आप ओडीएस सोर्सहैंडलर को जोड़ सकते हैं / ओवरराइड कर सकते हैं, आपको ओपी की समस्या को हल करने के लिए वास्तव में आवश्यकता नहीं है।
सॉफ्टवेयर इंजीनियर

@EngineerDollery टिप्पणी के लिए धन्यवाद, यह मेरा इरादा था, लेकिन मैंने स्पष्ट रूप से स्पष्टीकरण जोड़ा
फ्रांसिस्को Spaeth

मैंने अपने css / js को src / main / Resources / static फ़ोल्डर में स्थानांतरित कर दिया और त्रुटियाँ अब नहीं हैं, लेकिन मैं अभी भी अपने पृष्ठ में प्रदर्शित करने के लिए css प्राप्त करने में सक्षम नहीं हूं।
हेटम जबर

यार, मैंने इस काम के समाधान को खोजने के लिए इंटरनेट की गहराई की यात्रा की। ऐसा लगता है कि कुंजी का संयोजन था @EnableWebMvcऔर WebMvcAutoConfigurationAdapter। धन्यवाद बड़ा समय!
इयान न्यूलैंड

यह मेरे लिए बॉक्स से बाहर काम नहीं किया। मुझे इसे भी जोड़ना था। मैं सिर्फ अपनी टिप्पणी यहां जोड़ रहा हूं क्योंकि मुझे दो समस्याएं थीं। मेरे पास एक नियंत्रक भी था जिसने @Jones मेंशन के रूप में "/" मैप किया। ऐसा करने और मेरे "/" नियंत्रक को हटाने से मेरी समस्याएं हल हो गईं।
लॉयलब्रोन

11

क्या आपने स्प्रिंग बूट संदर्भ डॉक्स की जांच की ?

डिफ़ॉल्ट रूप से स्प्रिंग बूट क्लासपाथ में या /static( सर्वलेटकोटेक्स्ट) की जड़ से ( /publicया /resourcesया /META-INF/resources) नामक फ़ोल्डर से स्थिर सामग्री की सेवा करेगा ।

आप अपने प्रोजेक्ट की तुलना स्प्रिंग एमवीसी के साथ वेब सर्विंग गाइड के साथ कर सकते हैं या स्प्रिंग-बूट-सैंपल-वेब-यूआई प्रोजेक्ट के स्रोत कोड की जांच कर सकते हैं ।


2
हां मैंने किया, वे स्थान हैं जिन्हें मैंने आजमाया, जैसा कि डॉक्स द्वारा निर्देश दिया गया है। लेकिन कुछ भी काम नहीं करता है। मुझे नहीं मिलता कि संसाधन क्यों नहीं मिला। मैंने नमूनों को देखने की कोशिश की है, अजीब तरह से कोई नमूना नहीं है जो डॉक्स द्वारा प्रस्तावित संरचना का उपयोग करता है। आपने जो अभी-अभी पेस्ट किया है, वह एक टेम्पलेट फ़ोल्डर का उपयोग करता है, मैं मान रहा हूं कि यह थाइमेल्फ कॉन्फ़िगरेशन या वेग के लिए है।
विनीसियस कार्वाल्हो

वेब यूआई नमूना ( github.com/spring-projects/spring-boot/tree/v1.1.3.RELEASE/… ) स्थैतिक सामग्री परोसता है।
एंडी विल्किंसन

मैं @ViciciusCarvalho से सहमत हूं, मैंने सीएसएस / जेएस को सही स्थान पर लाने के लिए हर संयोजन की कोशिश की है और ऐसा करने के लिए प्रतीत नहीं हो सकता है। भले ही मैं लोकलहोस्ट का दौरा करूँ: /० / ९ / सीएसएस / शैलियाँ। मैं कुछ भी नहीं देखता हूं। शरीर का रंग बदलने के लिए मेरे पास केवल एक ही नियम है।
हेटम जबर

10

मुझे यह सटीक समस्या हो रही थी, तब मुझे एहसास हुआ कि मैंने अपने आवेदन में परिभाषित किया था।

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

जो मैंने कोशिश की थी सब कुछ खत्म हो गया था। मेरे मामले में, मैं दोनों को रखना चाहता था, इसलिए मैंने सिर्फ संपत्ति रखी और जोड़ा:

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

जिसने src / main / resource / static से स्थानीयहोस्ट के रूप में फाइलें सेव कीं: {port} /file.html।

उपर्युक्त में से किसी ने भी मेरे लिए काम नहीं किया क्योंकि किसी ने भी इस छोटी संपत्ति का उल्लेख नहीं किया था जिसे आसानी से एक अलग उद्देश्य की पूर्ति के लिए ऑनलाइन से कॉपी किया जा सकता था;)

आशा करता हूँ की ये काम करेगा! यह इस समस्या से पीड़ित लोगों के लिए जवाब के लंबे पोस्ट में अच्छी तरह से फिट होगा।


मैं स्प्रिंग बूट 2.0.5 का उपयोग कर रहा हूं। कृपया जारी रखें और spring.resources.static-locations=file:/var/www/static,classpath:staticअपने आवेदन में डाल दें। अनुभव करें, लेकिन यह मेरे लिए काम नहीं आया। मैं @EnableWebMvcअपने विन्यास वर्ग का उपयोग कर रहा हूं ।
एन। नागो

यह वह था जिसने मेरे मुद्दे को हल किया। साथ security.ignoredऔरsecurity.publicPaths
JoSSte

5

मुझे लगता है कि पिछले उत्तर विषय को बहुत अच्छी तरह से संबोधित करते हैं। हालाँकि, मैं इसे एक मामले में जोड़ूंगा जब आप अपने आवेदन में स्प्रिंग सिक्योरिटी सक्षम करते हैं, तो आपको विशेष रूप से स्प्रिंग को अन्य स्थैतिक संसाधन निर्देशिकाओं जैसे "" / स्थिर / फोंट "" के लिए अनुरोध करने की अनुमति देनी पड़ सकती है ।

मेरे मामले में, मेरे पास "/ स्थिर / css", "/ static / js", "/ static / images" डिफ़ॉल्ट रूप से अनुमति है, लेकिन मेरे स्प्रिंग सुरक्षा कार्यान्वयन द्वारा / स्थिर / फोंट / ** अवरुद्ध कर दिया गया था।

नीचे एक उदाहरण है कि मैंने यह कैसे तय किया।

@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 को स्प्रिंग बूट 5.0 के रूप में चित्रित किया गया है। Googling इसे उस वर्ग के लिए Javadocs में बदल देता है: "5.0 के रूप में WebMvcConfigurer के पास डिफ़ॉल्ट विधियां हैं (जावा 8 बेसलाइन द्वारा संभव बनाया गया है) और इस एडेप्टर की आवश्यकता के बिना इसे सीधे लागू किया जा सकता है।" तो मुझे लगता है कि अब एक WebMvcConfigurer लागू करता है।
मैरवो

@ मर्वो जो बिल्कुल सही है। 5.x में ऐसा करने का उचित तरीका लागू करना है WebMvcConfigurer
बाल

4

यह समाधान मेरे लिए काम करता है:

पहले, संरचना के अनुसार वेबैप / वेब-इन के तहत एक संसाधन फ़ोल्डर डालें

-- 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 / संसाधन / छवि / yourimage.jpg तक पहुँच सकते हैं


3

विचार करने के लिए 2 चीजें हैं (स्प्रिंग बूट v1.5.2.RELEASE) - 1) @EnableWebMvc एनोटेशन के लिए सभी नियंत्रक कक्षाओं की जांच करें, यदि कोई है तो इसे हटा दें 2) नियंत्रक कक्षाओं की जांच करें जिसके लिए एनोटेशन का उपयोग किया जाता है --RestController या @Controller । रेस्ट एपीआई और एमवीसी व्यवहार को एक कक्षा में न मिलाएं। MVC के लिए @Controller और REST API के लिए @RestController का उपयोग करें

2 बातें ऊपर करने से मेरा मसला हल हो गया। अब मेरा स्प्रिंग बूट किसी भी मुद्दे के साथ स्थैतिक संसाधनों को लोड कर रहा है। @Controller => लोड 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 को हटाकर यह मेरे लिए था! धन्यवाद
टर्बो

3

निर्देशिका के अंतर्गत स्थिर संसाधन रखें :

/src/main/resources/static

इस संपत्ति को application.properties फ़ाइल में जोड़ें

server.servlet.context-path=/pdx

आप http: // localhost: 8080 / pdx / images / image.jpg से एक्सेस कर सकते हैं

यहां छवि विवरण दर्ज करें


1
मुझे नहीं पता कि आपको धन्यवाद कैसे कहना है । भाई तुम महान हो। मैंने ऊपर दिए गए लगभग सभी समाधानों की कोशिश की लेकिन यह सबसे अच्छा और सबसे छोटा है।
user12061795

2

समस्या के मामले में जब एक आईडीई (यानी ग्रहण या IntelliJ विचार से शुरू) के भीतर से आवेदन को लॉन्च करने पर सतह की सतह, और मावेन का उपयोग करते हुए, समाधान की कुंजी स्प्रिंग-बूट में शुरू हो रही है प्रलेखन:

यदि आप मावेन का उपयोग कर रहे हैं, तो निष्पादित करें:

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 का उपयोग कर रहा हूं और जर्सी कार्यान्वयन के माध्यम से आरईएसटी-सेवाओं के एक समूह की मेजबानी कर रहा हूं। जब तक मैंने HTML + js फ़ाइलों के एक जोड़े को जोड़ने का फैसला किया तब तक ठीक काम किया। इस मंच पर दिए गए जवाबों में से किसी ने भी मेरी मदद नहीं की। हालाँकि, जब मैंने अपने pom.xml पर निर्भरता के बाद src / main / resource / static में सभी सामग्री को जोड़ा, तो अंत में वर्जन के माध्यम से लाया गया:

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

ऐसा लगता है कि स्प्रिंग-वेब / स्प्रिंग-वेबमेक एक महत्वपूर्ण सकर्मक निर्भरता है जो स्प्रिंग बूट ऑटो कॉन्फिग को चालू करता है।


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 / resource / static में डाल दिया और यह बस जादू की तरह काम किया।


2.2.6 में मेरा स्प्रिंग संस्करण और मेरे पास @EnableAutoConfiguration और फाइलें src / main / resource / static के तहत हैं, लेकिन यह काम नहीं करता है और 500 फेंकता है।
शिवानी ठाकुर

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 / Resources के तहत स्टेटिक फ़ोल्डर बनाने के लिए मेनू विकल्प न्यू-> सोर्स फोल्डर (नया नहीं -> फ़ोल्डर) का उपयोग करना होगा। पता नहीं क्यों यह काम करता है, लेकिन नया -> स्रोत फ़ोल्डर तब मैंने फ़ोल्डर का नाम स्थिर रखा (तब स्रोत फ़ोल्डर संवाद एक त्रुटि देता है जिसके लिए आपको जांच करनी चाहिए: नेस्टिंग को हल करने के लिए अन्य स्रोत फ़ोल्डर में अपवर्जन फ़िल्टर अपडेट करें)। मेरे नए स्थिर फ़ोल्डर को मैंने index.html जोड़ा और अब यह काम करता है।


0

अच्छी तरह से कभी-कभी जांच के लायक है कि क्या आपने कुछ बाकी नियंत्रक द्वारा वैश्विक मैपिंग को ओवरराइड किया था। सरल उदाहरण गलती (कोटलिन):

@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 / resource / static के तहत संसाधनों को देखते हुए, यदि आप इस कोड को जोड़ते हैं, तो src / main / Resources / static से सभी स्थिर सामग्री "/" के तहत उपलब्ध होगी:

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

0

मेरे मामले में, कुछ स्टैटिक फाइलें नहीं दी गईं, जैसे .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

/ ** के अनुरोधों का मूल्यांकन संसाधनप्रोपायरी में कॉन्फ़िगर किए गए स्थिर स्थानों के लिए किया जाता है

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 में फ़ाइलों के लिए एक और uri चाहता / चाहती हूँ : / Magicofiles / * आपको थोड़ा और कॉन्फिग की आवश्यकता है

@Configuration
class MyConfigClass implements WebMvcConfigurer

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

-1

जैसा कि ऊपर कहा गया है, फ़ाइल $ClassPath/static/images/name.png(/ स्थिर या / सार्वजनिक या / संसाधन या / मेटा-इन / संसाधनों) में होनी चाहिए । यह $ ClassPath का अर्थ है main/resourcesया main/javadir।

यदि आपकी फ़ाइलें मानक dirs में नहीं हैं, तो आप निम्न कॉन्फ़िगरेशन जोड़ सकते हैं:

@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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.