स्प्रिंग 5 Xml में WebContentInterceptor में cacheControlMappings कैसे सेट करें

Aug 24 2020

मैं स्प्रिंग एमवीसी में URL के एक जोड़े के लिए कैश-कंट्रोल निर्देश (दोनों सार्वजनिक और अधिकतम-आयु सेकंड सेट) को जोड़ना चाहता हूं और मैं केवल ApplicationContext.xml के माध्यम से उन परिवर्तनों को करना चाहता हूं।

मैं नक्शा गुण सेट करने के लिए कोशिश कर रहा हूँ cacheControlMappingsकी org.springframework.web.servlet.mvc.WebContentInterceptor, लेकिन समस्या सिर्फ वर्ग जो संपत्ति के लिए कोई सेटर विधि है की डिजाइन है। वर्कअराउंड के रूप में, मैं इस addCacheMappingविधि का उपयोग कर रहा हूँ org.springframework.beans.factory.config.MethodInvokingBean।

स्प्रिंग- mvc-config.xml में मेरा कॉन्फ़िगरेशन इस प्रकार है - मैं निम्नानुसार CacheControlसेम बना रहा हूं , और मैंने डिबगिंग द्वारा सत्यापित किया कि यह बीन एप्लिकेशन संदर्भ में उपयुक्त उचित मानों के साथ सफलतापूर्वक बनाया गया है।

<bean id="cacheControlFactory" class="org.springframework.http.CacheControl" factory-method="maxAge">
    <constructor-arg index="0" value="3600"/>
    <constructor-arg index="1">
        <value type="java.util.concurrent.TimeUnit">SECONDS</value>
    </constructor-arg>
</bean>

<bean id="myCacheControl" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject">
        <ref bean="cacheControlFactory"/>
    </property>
    <property name="targetMethod">
        <value>cachePublic</value>
    </property>
</bean>

- तो फिर मैं इस पद्धति को लागू करना चाहते हैं public void addCacheMapping(CacheControl cacheControl, String... paths)की WebContentInterceptorजो नक्शे के लिए प्रविष्टियां जोड़ देगा cacheControlMappings।

मैंने सत्यापित किया कि इस विधि को कॉल करना प्रोग्रामेटिक रूप से बहुत अच्छा काम करता है, इसलिए इसे ठीक से काम करना चाहिए अगर मैं इसे एक्सएमएल से ठीक करूँ? लेकिन मैं वही करने की कोशिश कर रहा हूं, जैसा कि नीचे दिखाया गया है, लेकिन यह मेरे लिए काम नहीं करता है, और मुझे अंतिम नक्शे में शून्य प्रविष्टियां मिलती हैं।

<bean class="org.springframework.beans.factory.config.MethodInvokingBean">
    <property name="targetObject">
        <ref bean="webContentInterceptor"/>
    </property>
    <property name="targetMethod">
        <value>addCacheMapping</value>
    </property>
    <property name="arguments">
        <list>
            <ref bean="myCacheControl" />
            <value>/home</value>
            <value>/dp/**</value>
            <value>/**/b/*</value>
        </list>
    </property>
</bean>

उपरोक्त आह्वान MethodInvokingBeanकाम नहीं करने के साथ क्यों करता है ? क्या मैं तर्कों को किसी भी तरह से गलत ठहरा रहा हूं? क्या varargs को एक अलग हैंडलिंग की आवश्यकता है? मुझे सर्वर स्टार्टअप के दौरान कोई त्रुटि नहीं दिखाई देती है।

इसके अलावा, मैं इस SO थ्रेड ( कैश-कंट्रोल सेट करने का तरीका: स्प्रिंग 4.2 या बाद के संस्करण में निजी के साथ निजी ) से अवगत हूं जहां स्वीकृत उत्तर में उल्लेख है कि एक्सएमएल में ऐसा करने का कोई तरीका नहीं है। मैं फिर से पुष्टि करना चाहता था कि क्या उपरोक्त समाधान को लागू करने की कोशिश करके सही है, लेकिन यह काम नहीं कर रहा है, लेकिन मैं क्यों नहीं देखता हूं।

जवाब

Anurag Aug 25 2020 at 04:52

जैसा कि मुझे संदेह था, जिस तरह से बहस हो रही थी, उसमें एक मुद्दा था। एक वसंत इंजेक्शन में varargs को तर्कों के अधिभार के बजाय एक स्पष्ट सूची के रूप में दिया जाना चाहिए (जैसे कि यह जावा में किया गया है)।

तो ऐसी विधि को लागू करने का सही तरीका -

public void addCacheMapping(CacheControl cacheControl, String... paths)

वसंत में आवेदनकेंटेक्स.एक्सएमएल इस प्रकार है -

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject">
        <ref bean="webContentInterceptor"/>
    </property>
    <property name="targetMethod">
        <value>addCacheMapping</value>
    </property>
    <property name="arguments">
        <list>
            <ref bean="myCacheControl" />
            <list>
                <value>/home</value>
                <value>/dp/**</value>
                <value>/**/b/*</value>
            </list>
        </list>
    </property>
</bean>

जैसा कि आप देख सकते हैं कि मैंने अब उपयोग किया है MethodInvokingFactoryBean। किसी तरह MethodInvokingBeanमेरे लिए काम नहीं किया।