java वसंत 4 - addResource हैंडलर स्थिर संसाधनों का समाधान नहीं कर रहे हैं




2 Answers

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

यदि प्रेषक सर्लेट उस पर आप अपनी कॉन्फ़िगरेशन क्लास को रूट ("/") पर मैप नहीं करते हैं, लेकिन शीर्ष शब्द (जैसे "/ data /") पर मैप किया जाता है, तो आपको एक ही समस्या का सामना करना पड़ सकता है।

मान लीजिए मेरे पास मेरे प्रेषक सर्वलेट के लिए "/ data / *" के रूप में मैपिंग है। तो मेरी कॉल की तरह दिखता है

http://localhost:8080/myWebAppContext/data/command

और मैंने सोचा कि अगर मेरे पास संसाधन मैपिंग है जैसे "/ content / ** / *", तो मेरे पास इसका उपयोग है

http://localhost:8080/myWebAppContent/content/resourcePath

लेकिन यह सच नहीं है, मुझे उपयोग करना चाहिए

http://localhost:8080/myWebAppContent/data/content/resourcePath

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

लेकिन मैं इसे अपने फ्रंटएंड (एंजुलरजेएस) में बहुत स्पष्ट बनाना चाहता हूं कि क्या मैं डेटा (आरईएसटी सेवाओं के माध्यम से) या एक सामग्री (सादे ग्रंथों को लौटाना) की तलाश करता हूं। डेटा डेटाबेस से आता है, लेकिन सामग्री फाइलों से आती है (जैसे पीडीएफ दस्तावेज़)। इसलिए, मैंने प्रेषक सर्वलेट में दो मैपिंग जोड़ने का निर्णय लिया:

public class MidtierWebConfig implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext servletContext) throws ServletException {

    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
    rootContext.register(MidtierAppConfig.class);

    servletContext.addListener(new ContextLoaderListener(rootContext));

    AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
    dispatcherContext.register(MidtierDispatcherConfig.class);

    Dynamic netskolaDispatcher = servletContext.addServlet(
        "dispatcher",
        new DispatcherServlet(dispatcherContext)
    );
    netskolaDispatcher.setLoadOnStartup(1);
    netskolaDispatcher.addMapping("/data/*");
    netskolaDispatcher.addMapping("/content/*");
}

}

MidtierAppConfig क्लास खाली है, लेकिन MidtierDispatcherConfig स्थिर संसाधनों को परिभाषित करता है:

@Configuration
@ComponentScan("my.root.package")
@EnableWebMvc
public class MidtierDispatcherConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
            .addResourceHandler("/courses/**/*")
            .addResourceLocations("/WEB-INF/classes/content/")
        ;
    }
}

अब जब मैं अपने @ नियंत्रक तक पहुंच प्राप्त करना चाहता हूं, तो मैं / डेटा / उपसर्ग का उपयोग करता हूं, और जब मैं अपने संसाधनों तक पहुंच बनाना चाहता हूं, तो मैं / सामग्री / उपसर्ग का उपयोग करता हूं। चेतावनी यह है कि अगर मेरे पास @RequestMapping ("/ app") कक्षा है जिसमें @RequestMapping ("/ about") विधि है, तो डेटा / ऐप / के बारे में और सामग्री / ऐप / लगभग दोनों ही विधि को कॉल करेंगे ( और वास्तव में मुझे लगता है कि मैं अनुमान लगा सकता हूं कि मैं संसाधनों को / ऐप / पाठ्यक्रम / व्हाटएवरपाथ के रूप में भी एक्सेस कर सकता हूं), क्योंकि प्रेषक "डेटा /" और "सामग्री /" दोनों को सूचीबद्ध करता है, और केवल बाकी यूआरएल ("ऐप / "दोनों मामलों में) उचित @ नियंत्रक खोजने के लिए।

भले ही, मैं जिस मौजूदा समाधान पर पहुंचा हूं वह मेरे लिए पर्याप्त संतोषजनक है, इसलिए मैं इसे छोड़ दूंगा।

java spring spring-mvc spring-annotations spring-4

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

वसंत 4 लोडिंग स्थिर संसाधन

http://imwill.com/spring-mvc-4-add-static-resources-by-annotation/#.U5GZlXKs9i4

लेकिन जेएसपी फाइल संसाधन लोड नहीं कर सका, सभी स्थिर सामग्री अनुरोध 404 त्रुटि देता है। मैंने जेएसपी में इन चीजों की कोशिश की,

 <link href="resources/css/bootstrap.css" rel="stylesheet" media="screen">
 <link href="/resources/css/bootstrap.css" rel="stylesheet" media="screen">
 <link href="css/bootstrap.css" rel="stylesheet" media="screen">

संपादित करें: मैं सर्वलेट 2.5 का उपयोग कर रहा हूं क्योंकि अब तक मैं अपनी परियोजना को जेबॉस 5 से उच्च संस्करणों में अपग्रेड नहीं कर सकता। जेबॉस 5 सर्वलेट्स 3 का समर्थन नहीं करता है, और क्या इससे कोई फर्क पड़ता है?

@Configuration
@ComponentScan("com.mgage.mvoice")
public class MyAppWebConfig extends WebMvcConfigurerAdapter {
     public void addResourceHandlers(ResourceHandlerRegistry registry) {  
        // I tried these many combinations separately.

        ResourceHandlerRegistration resourceRegistration = registry
            .addResourceHandler("resources/**");
        resourceRegistration.addResourceLocations("/resources/**");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/**");
        registry.addResourceHandler("/img/**").addResourceLocations("/img/**");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/**");
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("classpath:/resources/"); 
              // do the classpath works with the directory under webapp?
     }

}




किसी संसाधन के फ़ाइल नाम को रखने के लिए वेब पेज के यूआरआई को सरल बनाना संभव है:
<link href="bootstrap.css" rel="stylesheet" media="screen">
एक उचित विन्यास निम्न के रूप में हो सकता है:

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

स्प्रिंग एक संसाधन के वास्तविक स्थान की पहचान करने के लिए यूआरआई से निकाले गए फ़ाइल नाम के साथ 'संसाधन / सीएसएस /' स्ट्रिंग को संयोजित करता है।






Related