স্প্রিং বুট স্থির সামগ্রী সরবরাহ করছে না


173

স্থির সামগ্রী সরবরাহ করার জন্য আমি আমার স্প্রিং-বুট প্রকল্পটি পেতে পারি না।

আমি staticনীচে একটি ফোল্ডার রেখেছি src/main/resources। এর ভিতরে আমার একটি ফোল্ডার রয়েছে images। আমি যখন অ্যাপটি প্যাকেজ করি এবং এটি চালিত করি, তখন আমি সেই ফোল্ডারে যে চিত্রগুলি রেখেছি তা এটি খুঁজে পাবে না।

আমি স্ট্যাটিক ফাইল করা করার চেষ্টা করেছি public, resourcesএবং META-INF/resourcesকিন্তু কিছুই কাজ করে।

আমি যদি জার -tvf অ্যাপ.জারটি জার করি তবে আমি দেখতে পাচ্ছি যে ফাইলগুলি ডান ফোল্ডারের জারের ভিতরে রয়েছে: /static/images/head.pngউদাহরণস্বরূপ, কিন্তু কল করা :, আমি যা পাই তা http://localhost:8080/images/head.pngসবই একটি404

কোনও ধারণা কেন বসন্ত-বুট এটি খুঁজে পাচ্ছে না? (আমি 1.1.4 বিটিডাব্লু ব্যবহার করছি)


6
/ ** এ ডিফল্ট সংস্থান হ্যান্ডলিং মানচিত্র। আমি এটি সক্ষম কিনা তা ডাবল-চেক করব। যদি এটি হয় তবে আপনি যখন আপনার অ্যাপ্লিকেশন শুরু করবেন তখন আউটপুটে "শ্রেণীবদ্ধ org.springframework.web.servlet.resource.ResourceHttpRequestHandler]" টাইপ হ্যান্ডলারের উপর "ম্যাপযুক্ত ইউআরএল পাথ [/ **] দিয়ে শেষ হবে এমন একটি লাইন আপনি দেখতে পাবেন। আর একটি সম্ভাবনা আপনার নিজের একটি নিয়ামক যা / ** এ ম্যাপ করে এবং রিসোর্স হ্যান্ডলারের চেয়ে অগ্রাধিকার গ্রহণ করে। আপনার অ্যাপ্লিকেশনটির সূচনার আউটপুট পোস্ট করা আমাদের জন্য কী চলছে তা দেখতে আরও সহজ করে তুলবে।
অ্যান্ডি উইলকিনসন

12
আমি অনুমান করছি @EnableWebMvcআপনার অ্যাপটিতে আপনার (বা সমমানের) রয়েছে। এটি ডিফল্ট বুট এমভিসি কনফিগারেশনটি স্যুইচ করবে।
ডেভ সায়ার

1
নাহ, আমার আর কোথাও @EableWebMvc নেই। আমি এই না। এখন এটি টেমপ্লেটগুলির সাথেও ঘটছে। আমার যে কোনও টেম্পলেট (ফ্রি মার্কার) বসন্ত বুটের ক্লাস লোডার দ্বারা সন্ধান করা হচ্ছে।
ভিনিসিয়াস কারভালহো

2
আমি অনুরূপ ইস্যুতে চলেছি এবং প্রস্তাবিত প্রস্তাবিত রেজোলিউশনগুলির সাথে কোনও ভাগ্যও পাইনি। কেউ যদি দয়া করে দেখে খুব দয়াবান হতে পারে তবে আমি কী ভুল করছি এটি সঠিকভাবে নির্দেশ করতে পারে এটির প্রশংসা হবে !!! github.com/kylebober/kbss
কাইল এস বোবার

3
আমি দেখতে পেলাম যে আমার কাছে যদি একটি ফাইল এসসিআর / প্রধান / সংস্থানসমূহ / পাবলিক / স্টাইল সিএসএস থাকে তবে তার জন্য ইউআরএলটি /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অনুরোধ ইউআরএল হলে এইভাবে পরিবেশিত হবে /index.html। পথটি সমাধানের জন্য দায়বদ্ধ ক্লাসটি, স্প্রিং ৪.১-এর হিসাবে 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);
    }

আইএমএইচও, আপনার কোডটিতে কম বাগ থাকার একমাত্র উপায় হ'ল যখনই সম্ভব কোড লেখা নয়। ইতিমধ্যে যা সরবরাহ করা হয়েছে তা ব্যবহার করুন, এমনকি যদি এটি কিছু গবেষণা নেয়, তবে ফিরতে এটি মূল্যবান।


3
এই উত্তর আসলে অনেক গবেষণার পরে। পড়তে দুর্দান্ত এক
একনশ রাস্তোগি

2
আমি যদি
অগ্রণী

2
@ অজিজিৎ সরকার বলতে চাইছি মূল সংস্থা পিভোটাল , কোনও খারাপ অনুভূতির জন্য দুঃখিত, তবে এটি উদ্দেশ্য ছিল না। পিভোটাল হ'ল স্প্রিংয়ের মালিক যদি আমি সঠিক হন। আমি এটি নথিভুক্ত করতে পারি, তবে তাদের কাছে এমন লোক রয়েছে যারা এর জন্য বেতন
পেয়েছে

1
@ অ্যালিওপি স্প্রিং একটি ওপেন সোর্স প্রকল্প।
অভিজিৎ সরকার

3
আপনার কোডটিতে কম বাগ থাকার একমাত্র উপায় হ'ল কোডটি লেখা নয় [...] সত্যিই এটি পছন্দ।
ক্লাইজস্টাররা

78

সামগ্রীটি পরিবেশন করতে আমার বসন্ত-বুট জারটি পেতে স্প্রিং-বুট যা বলেছে তার বিপরীতে: আমাকে এই কনফিগার শ্রেণীর মাধ্যমে আমার এসআরসি / প্রধান / সংস্থান / স্থির সামগ্রীটি বিশেষভাবে যুক্ত করতে হয়েছিল:

@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
আমার স্প্রিং বুটের একই সংস্করণ, একই সংস্করণ রয়েছে তবে এটি আমার
পক্ষেও কার্যকর

1.2.5 সংস্করণে আমার সমস্যাটি স্থির করলেন !! আপনাকে অনেক ধন্যবাদ .. এই ভোট দিন !!
mrclrchtr

এই হ্যাকটি কাজ করে ... অদ্ভুত যে অটো কনফিগারেশন ব্যর্থ হয়
অ্যালান ভাইটাল

আফসোস, এই হ্যাকটি আমার পক্ষে কাজ করে না যা কমনীয়তার কারণে লজ্জাজনক। আমি নিশ্চিত নই যে মূল কারণটি যদি উত্সের পথে যায়। সম্ভবত, যেহেতু আমি এটি উইন্ডোতে চালাচ্ছি, তাদের আলাদাভাবে ফর্ম্যাট করা দরকার?
একারলস্টাইন

50

আমারও একই সমস্যা ছিল এবং এটি প্রমাণিত হয়েছিল যে সহজ সমাধানটি ছিল আমার কনফিগারেশন ক্লাসটি বাড়ানো WebMvcAutoConfiguration:

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

আমার স্থিতিশীল বিষয়বস্তু পরিবেশন করার অনুমতি দেওয়ার জন্য আমার অন্য কোনও কোডের দরকার নেই, তবে আমি publicআন্ডার নামে একটি ডিরেক্টরি স্থাপন করেছি src/main/webappএবং মাইভেনকে src/main/webappএকটি সংস্থার ডিরেক্টরি হিসাবে চিহ্নিত করতে একটি ডিরেক্টরি রেখেছি । এর অর্থ এটি publicঅনুলিপি করা হয়েছে target/classesএবং সুতরাং বসন্ত-বুট / টমক্যাটের সন্ধানের জন্য রানটাইমে ক্লাসপথে রয়েছে।


এই ভাবে স্থিতিশীল সংস্থানগুলি অন্য কোনও প্রোফাইলে কাজ করছে না। উদাহরণস্বরূপ আমার প্রকাশের জন্য একটি প্রোফাইল রয়েছে যা অন্য আইপি ঠিকানা ব্যবহার করে। আমি আমার সমস্ত সংস্থান হিসাবে 404 ত্রুটি পেয়েছি।
মাহদি

24

"/" তে ম্যাপযুক্ত বা কোনও ম্যাপ ম্যাপ না থাকা কন্ট্রোলারদের সন্ধান করুন।

আমার এ জাতীয় সমস্যা ছিল, ৪০৫ টি ত্রুটি পেয়েছি এবং কয়েক দিন ধরে আমার মাথা শক্ত করে। সমস্যাটি এমন কোনও @RestControllerটিকাশিত নিয়ামক হিসাবে পরিণত হয়েছিল যা আমি কোনও টিকা দিয়ে মন্তব্য করতে ভুলে গিয়েছিলাম @RequestMapping। আমি অনুমান করি যে এই ম্যাপ করা পথটি "/" এ ডিফল্ট হয়েছে এবং স্থির সামগ্রী সামগ্রী ম্যাপিংকে অবরুদ্ধ করে।


1
আমার জন্য এটি সমাধান! আমার কাছে @ রিস্টকন্ট্রোলার ("/ blubb") দিয়ে মন্তব্য করা একটি নিয়ামক ছিল যা স্পষ্টতই ভুল, তবে কখনও কখনও আপনি গাছগুলির জন্য কাঠ দেখতে পাচ্ছেন না। @RestController এ এটি পরিবর্তন করে @RequestMapping ("/ blubb") এর সমাধান করেছে
ক্রিংক্লেসরাস

আমি খুশি হয়েছি যে এটি সাহায্য করেছে, এবং এই ধারণাটি দেখে আমি আনন্দিত যে "সমস্ত গাছের জন্য কাঠ দেখতে পাচ্ছে না" এই অভিব্যক্তিটি জার্মান এবং
জোহানেস

2
আপনি যদি স্পষ্টতই @RequestMapping ("/") যুক্ত করতে পারেন তবে উদ্দেশ্য যদি উভয় স্থির সামগ্রী সরবরাহ করে এবং মূল অনুরোধগুলির জন্য একটি গতিশীল হ্যান্ডলার রাখে hand
mjj1409

1
বাহ .... এই দিনে 2 নষ্ট দিন ব্যয় করেছে। আমার স্প্রিং বুট এমভিসি অ্যাপ্লিকেশনটি বসন্ত সুরক্ষা ব্যবহার করে এবং স্টাইলস সিএসএস ফাইলটি দেখছিল না। আমি বিশ্বাস করি যে সুরক্ষা .jsp এর দ্বারা স্টাইলস সিএসএস ফাইল অ্যাক্সেস করতে দিচ্ছে না। আমার নিয়ামকটিতে আমার একটি @RequestMapping ({"", "/", "/ home"।) ছিল। "" এবং "/" খুঁজে নিয়েছে এবং আমার এমভিসি পুরোপুরি কাজ শুরু করেছে ... খুব আশ্চর্য।
স্ক্যানসফিল্ড 21

3
@ শফিউল নেই সক্ষম করুনআউটকোফিগারেশন এবং স্প্রিংবুট অ্যাপ্লিকেশন উভয়ই যুক্ত করা নিরর্থক! "@ স্প্রিংবুট অ্যাপ্লিকেশন" -এ "@EnableAutoConfigration" রয়েছে
দেহান ডি ক্রুস

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 এবং আবেদন রুট প্রসঙ্গে মোতায়েন শুরু হচ্ছে)।


এটি মন্তব্য করা সম্ভবত গুরুত্বপূর্ণ যে আপনি / ক্যান্সার / অ্যাড রিসোর্স হ্যান্ডলারগুলি ওভাররাইড করতে পারেন, তবে আপনাকে ওপির সমস্যা সমাধানের জন্য আসলে দরকার নেই।
সফটওয়্যার ইঞ্জিনিয়ার

@ ইঞ্জিনিয়ারডোলারি মন্তব্যটির জন্য ধন্যবাদ, এটি ছিল আমার উদ্দেশ্য কিন্তু আমি স্পষ্টভাবে ব্যাখ্যাটি যুক্ত করেছি
ফ্রান্সিসকো স্পেথ

আমি আমার সিএসএস / জেএসকে এসআরসি / মেইন / রিসোর্স / স্ট্যাটিক ফোল্ডারে স্থানান্তরিত করেছি এবং ত্রুটিগুলি আর নেই, তবে আমি এখনও আমার পৃষ্ঠায় সিএসএস পেতে সক্ষম হইনি।
হাতেম জাবের

বাবু, আমি এই কার্যনির্বাহী সমাধানটি খুঁজতে ইন্টারনেটের গভীরতায় ভ্রমণ করেছি। মনে হচ্ছে কী সমন্বয় ছিল @EnableWebMvcএবং WebMvcAutoConfigurationAdapter। ধন্যবাদ বড় সময়!
আয়ান নিউল্যান্ড

এটি আমার পক্ষে বাক্স থেকে বেরিয়ে আসেনি। আমি এটি যোগ করতে হবে। আমি এখানে আমার ভাষ্যটি যুক্ত করেছি কারণ আমার দুটি সমস্যা ছিল। আমার কাছে এমন একটি নিয়ামকও ছিল যা @ / জোহনেস উল্লেখ করেছেন বলে "/" ম্যাপ করেছে। এটি করে এবং আমার "/" নিয়ামকটি সরানো আমার সমস্যার সমাধান করে।
অনুগতব্রাউন

11

আপনি কি স্প্রিং বুট রেফারেন্স ডক্স পরীক্ষা করেছেন ?

ডিফল্টরূপে স্প্রিং বুট ক্লাসপথের /static( /publicবা /resourcesবা /META-INF/resources) নামক ফোল্ডার থেকে বা সার্লেটকন্টেক্সটের মূল থেকে স্থির সামগ্রী সরবরাহ করবে ।

আপনি স্প্রিং এমভিসির সাথে ওয়েব কন্টেন্ট পরিবেশনকারী গাইডের সাথেও আপনার প্রকল্পের তুলনা করতে পারেন বা বসন্ত-বুট-নমুনা-ওয়েব-ইউআই প্রকল্পের উত্স কোডটি পরীক্ষা করে দেখতে পারেন ।


2
হ্যাঁ আমি করেছি, সেই জায়গাগুলি আমি চেষ্টা করেছি ঠিক যেমন দস্তাবেজের নির্দেশনা। কিন্তু কিছুই কাজ করে না। রিসোর্সটি কেন মোটেই পাওয়া যায় না তা আমি পাই না। আমি নমুনাগুলি খতিয়ে দেখার চেষ্টা করেছি, অদ্ভুতভাবে এমন কোনও নমুনা নেই যা ডক্স দ্বারা প্রস্তাবিত কাঠামো ব্যবহার করে। আপনি কেবল যেটি পেস্ট করেছেন সে একটি টেম্পলেট ফোল্ডার ব্যবহার করে, আমি ধরে নিচ্ছি এটি থাইমেলিফ কনফিগারেশন বা বেগের জন্য।
ভিনিসিয়াস কারভালহো

ওয়েব ইউআই নমুনা ( github.com/spring-projects/spring-boot/tree/v1.1.3.RELEASE/… ) স্থির সামগ্রী সরবরাহ করে।
অ্যান্ডি উইলকিনসন

আমি @ ভিনিসিয়াস কারভালহোর সাথে একমত, আমি সিএসএস / জেএসকে সঠিক জায়গায় পাওয়ার জন্য যথাসাধ্য চেষ্টা করেছি এবং এটি করার মতো মনে হচ্ছে না। এমনকি আমি লোকালহোস্ট: 8089 / সিএসএস / স্টাইলস সিএসএস দেখতে গেলেও আমি কিছুই দেখতে পাই না। আমার কেবলমাত্র দেহের রঙ পরিবর্তন করার জন্য একটি নিয়ম রয়েছে।
হাতেম জাবের

10

আমার এই সঠিক সমস্যাটি ছিল, তখন আমি বুঝতে পারি যে আমি আমার অ্যাপ্লিকেশনটিতে সংজ্ঞা দিয়েছি।

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

যা আমি চেষ্টা করেছিলাম তার সমস্ত কিছুই ওভাররাইড করে। আমার ক্ষেত্রে, আমি উভয়ই রাখতে চেয়েছিলাম, তাই আমি কেবল সম্পত্তি রেখেছি এবং যুক্ত করেছি:

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

যা src / প্রধান / সংস্থানগুলি / স্ট্যাটিক থেকে লোকালহোস্ট হিসাবে: {বন্দর} /file.html ফাইল সরবরাহ করে।

উপরের কোনওটিই আমার পক্ষে কাজ করেনি কারণ এই ছোট্ট সম্পত্তিটির কথা কেউই উল্লেখ করেনি যা সহজেই কোনও ভিন্ন উদ্দেশ্যে পরিবেশন করার জন্য অনলাইন থেকে অনুলিপি করা যেতে পারে;)

আশা করি এটা সাহায্য করবে! এই সমস্যাযুক্ত লোকদের উত্তরগুলির দীর্ঘ পোস্টে এটি বেশ ভাল ফিট করবে Fig


আমি বসন্ত বুট 2.0.5.RELEASE ব্যবহার করছি এবং নির্বাণ spring.resources.static-locations=file:/var/www/static,classpath:staticআমার application.properties মধ্যে, কিন্তু এটা আমার জন্য কাজ করে নি। আমি @EnableWebMvcআমার কনফিগারেশন ক্লাস ব্যবহার করছি ।
এনজিও

এটিই আমার সমস্যা সমাধান করেছিল। পাশাপাশি security.ignoredএবংsecurity.publicPaths
জোএসটি

5

আমি মনে করি পূর্ববর্তী উত্তরগুলি বিষয়টিকে খুব ভালভাবে সম্বোধন করে। যাইহোক, আমি এটি যুক্ত করেছিলাম যে আপনি যখন আপনার অ্যাপ্লিকেশনটিতে স্প্রিং সিকিউরিটি সক্ষম করেছেন, তখন আপনাকে স্প্রিংকে অন্যান্য স্ট্যাটিক রিসোর্স ডিরেক্টরিতে যেমন "/ স্ট্যাটিক / ফন্ট" এর অনুরোধের অনুমতি দিতে বিশেষভাবে বলতে হবে ।

আমার ক্ষেত্রে আমার "/ স্ট্যাটিক / সিএসএস", "/ স্ট্যাটিক / জেএস", "/ স্ট্যাটিক / চিত্রগুলি" ডিফল্টরূপে অনুমোদিত ছিল, তবে / স্প্যাটিক / ফন্ট / ** আমার স্প্রিং সুরক্ষা বাস্তবায়ন দ্বারা অবরুদ্ধ ছিল।

নীচে আমি কীভাবে এটি স্থির করেছি তার একটি উদাহরণ দেওয়া হল।

@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 এ করার সঠিক উপায় হ'ল ওয়েবএমভিসি কনফিগারার বাস্তবায়ন করা


WebMvcConfigurerAdapter বসন্ত বুট 5.0 হিসাবে অবচয় করা হয়েছে। গুগলিং এটি এই শ্রেণীর জাভাডোকগুলিতে এটি চালু করে: "5.0 হিসাবে ওয়েবএমভিসিসিফিগুরারের ডিফল্ট পদ্ধতি রয়েছে (একটি জাভা 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: // লোকালহস্ট: 8080 / রিসোর্স / চিত্র / yourimage.jpg


3

2 টি বিষয় বিবেচনা করতে হবে (স্প্রিং বুট v1.5.2.RELEASE) - 1) @EnableWebMvc টীকাটির জন্য সমস্ত কন্ট্রোলার ক্লাস পরীক্ষা করে দেখুন, সেখানে যদি তা থাকে তবে এটি অপসারণ করুন 2) যে কন্ট্রোলার ক্লাসের জন্য টীকাটি ব্যবহার করা হয়েছে তা পরীক্ষা করুন - @ রিস্টকন্ট্রোলার বা @ নিয়ন্ত্রণকারী । রেস্ট এপিআই এবং এমভিসি আচরণ এক শ্রেণিতে মিশ্রিত করবেন না। এমভিসি এর জন্য @ কন্ট্রোলার এবং REST এপিআই ব্যবহারের জন্য @ রিস্টকন্ট্রোলার ব্যবহার করুন

2 টির উপরে কাজ করা আমার সমস্যার সমাধান করেছে। এখন আমার বসন্ত বুট স্থিতিশীল সংস্থানগুলি যে কোনও সমস্যা সহ লোড করছে। @ কন্ট্রোলার => লোড সূচক html => স্থির ফাইল লোড করে load

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

@EableWebMvc- কে সরানো আমার জন্য এটি করেছে! আপনাকে ধন্যবাদ
টার্বোমু

3

স্থিতিশীল সংস্থানসমূহ ডিরেক্টরিতে রাখুন :

/src/main/resources/static

এই সম্পত্তিটি প্রয়োগ করুন

server.servlet.context-path=/pdx

আপনি http: // লোকালহস্ট: 8080 / পিডিএক্স / চিত্র / চিত্র.jpg থেকে অ্যাক্সেস করতে পারেন

এখানে চিত্র বর্ণনা লিখুন


1
আপনাকে ধন্যবাদ জানাতে জানি না । ভাই আপনি দুর্দান্ত। আমি উপরের প্রায় সমস্ত সমাধান চেষ্টা করেছিলাম তবে এটি সেরা এবং সংক্ষিপ্ততম।
ব্যবহারকারী12061795

2

কোনও আইডিই (যেমন এক্লিপস বা ইন্টেলিজ আইডিয়া থেকে শুরু করে) অ্যাপ্লিকেশন চালু করার সময় এবং মাভেন ব্যবহার করে সমাধানের মূল কীটি স্প্রিং-বুট প্রারম্ভিক ডকুমেন্টেশনগুলিতে সমস্যাটি তলিয়ে যাওয়ার ক্ষেত্রে :

আপনি যদি মাভেন ব্যবহার করছেন তবে চালনা করুন:

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

যার গুরুত্বপূর্ণ অংশটি packageঅ্যাপ্লিকেশনটি শুরু হওয়ার আগে চালানোর লক্ষ্যটি যুক্ত করছে । (ধারনা: Runমেনু, Edit Configrations..., Add, এবং নির্বাচন Run Maven Goal, এবং উল্লেখ packageমাঠে গোল)


1

আমি ১.৩.৫ ব্যবহার করছি এবং জার্সি বাস্তবায়নের মাধ্যমে একটি গুচ্ছ আরএসটি-পরিষেবাগুলি হোস্ট করছি। আমি বেশ কয়েকটি এইচটিএমএল + জেএস ফাইল যুক্ত করার সিদ্ধান্ত না হওয়া পর্যন্ত এটি দুর্দান্ত কাজ করেছে। এই ফোরামে দেওয়া কোনও উত্তরই আমাকে সাহায্য করেনি। যাইহোক, যখন আমি আমার pom.xML এ নিম্নলিখিত নির্ভরতা যুক্ত করেছি তখন এসআরসি / প্রধান / সংস্থান / স্থির সমস্ত সামগ্রী শেষ পর্যন্ত ব্রাউজারের মাধ্যমে প্রদর্শিত হয়েছিল:

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

মনে হচ্ছে স্প্রিং-ওয়েব / স্প্রিং-ওয়েবএমভিসি হ'ল গুরুত্বপূর্ণ ট্রানজিটিভ নির্ভরতা যা স্প্রিং বুট অটো কনফিগারেশনটিকে চালু করে।


1

এফওয়াইআই: আমি আরও লক্ষ্য করেছি যে আমি একটি পুরোপুরি কাজ করা স্প্রিং বুট অ্যাপ্লিকেশনটিকে জগাখিচুবি করতে পারি এবং স্থির ফোল্ডার থেকে বিষয়বস্তু সরবরাহ করা থেকে বিরত রাখতে পারি, যদি আমি যদি এরকম খারাপ রেস্ট কন্ট্রোলার যুক্ত করি তবে

 @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

আপনার কনফিগারেশনে আপনার নিজের @EnableAutoConfigration আছে কিনা তাও নিশ্চিত হন ।

এবং সমস্ত স্থিতিশীল সংস্থানগুলিকে এসআরসি / প্রধান / সংস্থান / স্থিতিতে রাখুন এবং এটি কেবল অবশেষে ম্যাজিকের মতো কাজ করেছে ..


2.2.6 আমার বসন্ত সংস্করণ এবং আমি @EnableAutoConfiguration এবং src / প্রধান / সম্পদ / স্ট্যাটিক অধীনে ফাইল আছে কিন্তু এটা কাজ করে না এবং ছোঁড়ার 500
ঠাকুর Shivani

1

বসন্ত বুট 2 ব্যবহার করে। *, আমার কাছে এমন একটি নিয়ামক রয়েছে যা GetMapping({"/{var}", "/{var1}/{var2}", "/{var1}/{var2}/{var3}"})আমার অ্যাপ্লিকেশনগুলিতে সংস্থানগুলি বন্ধ করতে রুটগুলিতে মানচিত্র করে এবং বুম করে।

আমি জানি যে এ জাতীয় রুটগুলি রাখা ভাল নয় তবে এটি সমস্ত আপনি যে অ্যাপটি তৈরি করছেন তার উপর নির্ভর করে (আমার ক্ষেত্রে, এ জাতীয় রুটগুলি ছাড়া আমার আর কোনও বিকল্প নেই)

সুতরাং আমার অ্যাপটি পুনরায় সংস্থানগুলি সরবরাহ করবে তা নিশ্চিত করার জন্য এখানে আমার হ্যাক। আমার কেবল একটি নিয়ামক রয়েছে যা আমার সংস্থানগুলিতে মানচিত্র করে। যেহেতু বসন্তটি চলকের আগে কোনও সরাসরি রুটের সাথে মিলবে, তাই আমি নিয়ন্ত্রক পদ্ধতি যুক্ত করার সিদ্ধান্ত নিয়েছি যা /imgaes/{name}অন্য সংস্থানগুলিতে মানচিত্রের জন্য পুনরাবৃত্তি করে repeated

@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

গ্রেডেল এবং গ্রহপ ব্যবহার করে একই সমস্যা ছিল এবং এটি বের করার চেষ্টা করতে ঘন্টা সময় ব্যয় করে।

কোনও কোডিংয়ের প্রয়োজন নেই, কৌশলটি হ'ল এসআরসি / প্রধান / সংস্থানসমূহের অধীনে স্ট্যাটিক ফোল্ডারটি তৈরি করতে আপনাকে মেনু বিকল্পটি নিউ-> উত্স ফোল্ডার (নতুন নয় -> ফোল্ডার) ব্যবহার করতে হবে। কেন এটি কাজ করে তা জানেন না, তবে নতুন -> উত্স ফোল্ডারটি রেখেছিলেন তখন আমি ফোল্ডারটির নাম স্থিতি রেখেছি (তারপরে উত্স ফোল্ডার ডায়ালগ একটি ত্রুটি দেয় যার জন্য আপনাকে অবশ্যই পরীক্ষা করতে হবে: নেস্টিং সমাধানের জন্য অন্যান্য উত্স ফোল্ডারে এক্সক্লুশন ফিল্টার আপডেট করুন)। আমার নতুন স্থিতিশীল ফোল্ডারটি আমি 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

এসআরসি / মেইন / রিসোর্স / স্ট্যাটিকের অধীনে প্রদত্ত সংস্থানসমূহ, আপনি যদি এই কোডটি যুক্ত করেন, তবে এসসিআর / প্রধান / সংস্থান / স্ট্যাটিক থেকে সমস্ত স্ট্যাটিক সামগ্রী "/" এর অধীনে উপলব্ধ হবে:

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

0

আমার ক্ষেত্রে কিছু স্ট্যাটিক ফাইল সরবরাহ করা হয়নি, যেমন .ওফ ফন্ট এবং কিছু চিত্র। তবে সিএসএস এবং জেএস ঠিক কাজ করেছে।

আপডেট: স্প্রিং বুটকে ওয়াফ ফন্টগুলি সঠিকভাবে পরিবেশন করার আরও ভাল সমাধান হ'ল এই উত্তরে উল্লিখিত রিসোর্স ফিল্টারিংটি কনফিগার করা , উদাহরণস্বরূপ (নোট করুন যে আপনার অন্তর্ভুক্ত এবং বাদ দেওয়া উভয়ই দরকার):

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

ক্রেডিট: @ অভিজি আমাকে সঠিক দিকে 4 নিয়ে নির্দেশ করেছেন!


0

/ ** অনুরোধগুলি কনফিগার স্ট্যাটিক অবস্থানে মূল্যায়ন করা হয় resourceProperties

অ্যাপ্লিকেশন.প্রোপার্টিগুলিতে নিম্নলিখিতগুলি যুক্ত করা আপনার একমাত্র কাজ হতে পারে ...

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

এটি ডিফল্ট স্থিতিশীল অবস্থানগুলিকে ওভাররাইট করবে, যা হ'ল:

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

আপনি এটি করতে চাইবেন না এবং কেবলমাত্র নিশ্চিত করুন যে আপনার সংস্থানগুলি সেই ডিফল্ট ফোল্ডারগুলির মধ্যে একটিতে শেষ হয়েছে।

একটি অনুরোধ সম্পাদন করা: যদি আমি /public/example.html এ উদাহরণে html সঞ্চয় করে থাকি তবে আমি এটির মতো এটি ব্যবহার করতে পারি:

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

আমি যদি <host>/<context-path>/magico/*ক্লাসপথের ফাইলগুলির জন্য অন্য ইউরির মতো চাই : / ম্যাজিকফিলস / * আপনার আরও কিছুটা কনফিগার দরকার

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

যদি আপনার ফাইলগুলি স্ট্যান্ডার্ড ডায়ারে না থাকে তবে আপনি নিম্নলিখিত কনফিগারেশনটি যুক্ত করতে পারেন:

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

}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.