إعادة تحميل ملف الخصائص الذي يتم تحميله باستخدام setBundle

StackOverflow https://stackoverflow.com/questions/4136403

سؤال

كنت آمل في الحصول على القليل من المساعدة في مشكلة أواجه ملفات خصائص في الربيع. لذا فإن الإعداد الذي لدي مثل ذلك:

opto mapping.properties - يقع هذا في مجلد SRC الخاص بي ويحتوي على ترجمات لمواردتي المحسنة مثل ذلك:

generic-min.css=4037119659.css

يتم تحديث ملف المناسبة هذا في كل مرة يتم تشغيل "تحسين" الإنشاء. ثم استخدم

<fmt:setBundle basename="opto-mapping" />

لاستيراد ملف الخصائص الخاص بي في JSP المطلوب. ثم الرجوع إلى المحتوى باستخدام:

<fmt:message key='generic-min.css' />

كل هذا يعمل بشكل جميل باستثناء أن ملف الخصائص يتطلب إعادة تحميل TOMCAT. لا أريد أن أبدأ في نقل المواقع في كل مرة يتم فيها تحديث مورد. أرغب في إعادة تحميل ملف الخصائص تلقائيًا في كثير من الأحيان.

لقد حاولت تحديث حبة حالية في Spring -context.xml لإعادة تحميل ملف الخصائص هذا كما أفعل مع الترجمات ، لكن هذا لم ينجح - على الأرجح بسبب موقع ملفات Opto Mapping.Properties - لكنك ترى أنه يحتاج لتكون في هذا الموقع للتحميل باستخدام FMT: setBundle.

<bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="cacheSeconds">
            <value>1</value>
        </property>
        <property name="basenames">
            <list>
                <value>WEB-INF/translations/translations</value>
                <value>WEB-INF/classes/opto-mapping</value>
            </list>
        </property>
</bean>

أي مساعدة أو نقطة في الاتجاه الصحيح سيكون موضع تقدير كبير في هذا الوقت العصيب.

آمل أن يكون كل هذا يجعل Senese وشكرًا كبيرًا مقدمًا!

ج.

هل كانت مفيدة؟

المحلول

هناك بعض الأشياء التي قد تجربها.

<fmt:setBundle> سوف ندعو في النهاية ResourceBundle.getBundle(String, Locale, ClassLoader), ، حيث ستكون السلسلة اسم الأساس الخاص بك وسوف يكون جهاز التشغيل Classloader Thread.currentThread().getContextClassLoader(). إذا كنت تستخدم JDK 1.6 ، يمكنك المحاولة ResourceBundle.clearCache(ClassLoader) لمسح ذاكرة التخزين المؤقت الحزمة. سيكون من المنطقي القيام بذلك في مرشح servlet ودمجه مع بعض المنطق الآخر لتحديد متى يجب مسح ذاكرة التخزين المؤقت.

هناك زاوية أخرى هي السيطرة المباشرة على تحميل ملف الخصائص وتكوين JSTL. مرة أخرى ، الاستفادة من مرشح (تجاهل معالجة الاستثناء):

ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader();
URL propsURL = ctxLoader.getResource("opto-mapping.properties");
URLConnection propsConn = propsURL.openConnection();
long propsLastModified = propsConn.getLastModified();
// decide if you want to reload...
propsConn.setUseCaches(false);
InputStream propsIn = propsConn.getInputStream();
ResourceBundle propsBundle = new PropertyResourceBundle(propsIn);
propsIn.close();
LocalizationContext propsCtx = new LocalizationContext(propsBundle);
ServletContext servletCtx = this.filterConfig.getServletContext();
Config.set(servletCtx, Config.FMT_LOCALIZATION_CONTEXT, propsCtx);

ثم يمكنك فقط استخدام <fmt:message> في صفحاتك. يمكنك العثور على المستندات ل LocalizationContext و Config في ال JSTL API.

الكثير من الاختلافات الأخرى ممكنة ، ولكن تأكد من إلقاء نظرة على الأحدث ResourceBundle (بما فيها ResourceBundle.Control) الإضافات إلى JDK 1.6 ، ضع في اعتبارك وظيفة واجهات برمجة التطبيقات "ذات المستوى الأدنى" مثل URLConnection, ، وتصبح على دراية بالجوانب الأكثر برمجية لـ JSTL المتاحة من خلال واجهة برمجة التطبيقات الخاصة بها.

نصائح أخرى

شكرا لكم على حد سواء على ردودكم. لقد حصلت الآن على هذا العمل واعتقدت أنني سأشارك الثروة.

لذلك ، قمت بنقل ملف الخصائص الخاص بي من مجلد SRC وإلى خصائص الويب/الخصائص.

لقد قمت بتحديث الفول التالي لتحميل ملفات الخصائص:

<bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="cacheSeconds">
            <value>1</value>
        </property>
        <property name="basenames">
            <list>
                <value>WEB-INF/translations/translations</value>
                <value>WEB-INF/properties/opto-mapping</value>
            </list>
        </property>
    </bean>

الآن ، في السابق كنت أستخدم setBundle للتحميل في ملف الخصائص مثل هذا:

<fmt:setBundle basename="opto-mapping" />

لكنني وجدت أنه من الواضح أنه لم يعد يتم تحميل ملف الخصائص الخاص بي لأنني نقلته. ولكن بسبب إعداد Bean الخاص بي ، تم تحميل ملف الخصائص الجديدة ولكن تم كتابة ذلك في الكتابة.

لذلك ، كان الحل هو إزالة setBundle والآن يتم إعادة تحميل ملف الخصائص الخاص بي!

شكرًا لك مرة أخرى!

لن يقوم Tomcat بإعادة تحميل الموارد الموجودة على ClassPath. هذا مذكور في جافادوك إلى عن على ReloadableResourceBundleMessageSource:

نظرًا لأن خوادم التطبيق عادةً ما يتم تخزين جميع الملفات المحملة من ClassPath ، فمن الضروري تخزين الموارد في مكان آخر (على سبيل المثال ، في دليل "Web-Inf" لتطبيق الويب). وإلا فلن تنعكس التغييرات في الملفات في ClassPath في التطبيق.

تشمل مواقع ClassPath هذه WEB-INF/classes, ، ولن يتم إطلاق سراحه.

حاول التحرك opto-mapping.properties في مكان آخر (على سبيل المثال WEB-INF/messages) ، وجربها بعد ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top