2012-05-29 7 views
48

मैं वसंत 3.1 उपयोग कर रहा हूँ और वहाँ स्थान हड़पने के लिए एक रास्ता है लोकेल वर्तमान उपयोगकर्ता के लिए सक्रिय लगाना चाहते हैं सीधे बिना सेवा परत को नियंत्रक से इसे पारित करने के मजबूर किया जा रहा ... आदिस्प्रिंग्स से मौजूदा उपयोगकर्ता लोकेल को फ़ंक्शन के पैरामीटर के रूप में पास किए बिना कैसे प्राप्त करें?

करता है वसंत एक थ्रेड स्थानीय भंडारण में लोकेल स्टोर करता है जहां इसे कुछ स्थैतिक विधि बुलाकर पकड़ लिया जा सकता है?

उत्तर

110

मैं यह भी देख रहा था कि Locale पास किए बिना लोकेल का उपयोग कैसे करें, लेकिन मैं अभी भी वसंत के लिए बहुत नया हूं और भ्रमित होने के अधिकांश समाधान ढूंढता हूं। हालांकि, यह पता चला है कि स्प्रिंग एमवीसी स्थानीय स्थानीय भंडारण में लोकेल को स्टोर करता है।

Locale locale = LocaleContextHolder.getLocale(); 

पिछले दृष्टिकोण [...] एक धागा के लिए अपने वास्तुकला के किसी भी संस्था में वर्तमान स्थान प्रदान करने के लिए स्थानीय पर आधारित है: यह द्वारा पहुँचा जा सकता। [...] आपको अवगत होना चाहिए कि LocaleContextHolder की सामग्री डिफ़ॉल्ट रूप से वेब अनुरोध के भीतर निर्दिष्ट लोकेल से मेल खाती है।

से: Configuring locale switching with Spring MVC 3। (वह पोस्ट लोकेल प्राप्त करने के लिए वैकल्पिक कॉन्फ़िगरेशन/विधियों को भी प्रदान करती है, जो ऐसा करने के लिए किसी के लिए उपयोगी हो सकती है)।

आप वसंत here से LocaleContextHolder दस्तावेज़ भी देख सकते हैं।

+1

मेरे लिए भी काम किया, यहां लोकेल कॉन्टेक्स्टहोल्डर की विधि सूची http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/i18n/LocaleContextHolder.html है –

3

यह इस बात पर निर्भर करता है कि आपने लोकेल को सत्र में या कुकी में स्टोर करने के लिए कॉन्फ़िगर किया है?

मेरे आवेदन में मैंने नीचे दिए गए कॉन्फ़िगरेशन के साथ अपने सत्र में उपयोगकर्ता लोकेल को स्टोर करने के लिए कॉन्फ़िगर किया है।

<mvc:interceptors> 
     <ref bean="localeChangeInterceptor"/> 
    </mvc:interceptors> 

    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
     <property name="paramName" value="lang"/> 
    </bean> 

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> 
     <property name="defaultLocale" value="en"/> 
    </bean> 

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
     <property name="basenames"> 
     <list> 
      <value>/WEB-INF/i18n/labels</value> 
      <value>/WEB-INF/i18n/messages</value> 
      <value>/WEB-INF/i18n/include</value> 
     </list> 
     </property> 
     <property name="defaultEncoding" value="UTF-8"/> 
    </bean> 

यदि आपने ऐसा कुछ किया है तो आप आसानी से सत्र से लोकेल पैरामीटर पुनर्प्राप्त कर सकते हैं।

उम्मीद है कि यह आपकी मदद करता है।

चीयर्स।

+0

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

+0

उस स्थिति में आप अपनी सेवा में लोकल रीसोल्वर बीन को ऑटोवायर के रूप में भी प्राप्त कर सकते हैं और फिर आप सत्र में उपयोगकर्ता द्वारा निर्धारित वर्तमान लोकेल निर्धारित करने के लिए क्लास विधि को कॉल कर सकते हैं। –

+1

उत्कृष्ट विचार मैं कोशिश करूँगा कि – ams

2

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

+5

यह वही है ['LocaleContextHolder'] (http: // docs।spring.io/spring/docs/4.0.x/javadoc-api/org/springframework/context/i18n/LocaleContextHolder.html) करता है: 'लोकेल' को 'थ्रेडलोकल' चर में संग्रहीत करना। एक कस्टम हैक का उपयोग करने की कोई ज़रूरत नहीं है (क्योंकि वसंत पहले से ही आपके लिए हैक कर रहा है)। – cr7pt0gr4ph7

संबंधित मुद्दे

 संबंधित मुद्दे