MessageResourceBundle в Spring

2 февраля 2006

Когда пишешь resource bundle для Web-приложения часто мешает:

  • что для обновления текста на страницах нужно перегружать приложение
  • надо конвертить текст написанный по русски в Unicode.

Т.е. дергаем всякие native2ascii или Ant'ом пересобираем и перезапускам приложение.
А в Spring Framework есть замечательный класс ReloadableResourceBundleMessageSource, который решает все эти проблемы.

Пишем в spring.xml:

<bean id="messageSource"
          class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>/WEB-INF/messages/messages</value>
            </list>
        </property>
        <property name="useCodeAsDefaultMessage" value="true"/>
        <property name="defaultEncoding" value="Windows-1251"/>
        <property name="cacheSeconds" value="5"/>
    </bean>

Теперь Spring читает файлики /WEB-INF/messages/messages.properties, /WEB-INF/messages/messages_ru.properties и т.д. Если к моменту запроса они обновились, то перечитывает заново. И к томуже читает в указанной кодировке, что избавляет нас от запуска всяких лишних программ.

15 Комментариев на “MessageResourceBundle в Spring”

  1. Владимир сказал:

    Как такую настройку кодировки сделать в spring для DriverManagerDataSource или как то по другому, чтоб в базу знаки вопроса не писались на русском

  2. igor сказал:

    DriverManagerDataSource я не использовал, считаю что к базе нужно коннектится через пул, а не создавать коннекцию каждый раз.

    Но вообще там будет также как везде, т.е. зависеть от базы :) возможно к url базы надо дописать ?useUnicode=true

    Я обычно пользую Hibernate, там это решается параметром <prop key="hibernate.connection.useUnicode">true</prop>

  3. Владимир сказал:

    Спасибо за отклик.

    Я использую iBatis, не знаете, как там параметр прописать по кодировке?

    Да и еще встречный вопрос, а что если я использую, как dataSource DriverManagerDataSource и втыкаю его в iBatis механизма там нет пула? какой пул вы используете для Spring? спасибо

  4. Владимир сказал:

    Да забыл я использую MySql 5

  5. igor сказал:

    С iBatis совершенно не знаком. Но думаю ему тоже можно подсунуть пул созданный в другом месте.

    Я создаю пул из apache commons dbcp

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    ....
    <property name="url" value="jdbc:mysql://localhost/database?useUnicode=true">
    ...
    

    или можно брать датасурс из jndi, сконфигурив его c нужной кодировкой в контейнере.

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
       <property name="jndiName" value="java:comp/env/jdbc/DataSource"/>
    </bean>
    

    а потом этот dataSource подсовываю хибернейту. Наверное и iBatis так может принимать сурс.

    Догадываюсь что база у вас mySQL, т.к. я только в ней сталкивался с проблемами кодировки. Postgres и Oracle без дополнительных настроект у меня хранили русский текст.

  6. Владимир сказал:

    Огромное спасибо, я подсунул параметры для url базы

    ?Unicode=true&characterEncoding=cp1251 и все стало ок.

    Я думаю такая запись не считается проблемной, как вы считаете?

    Т.е. DriverManagerDataSource не имеет пула, а BasicDataSource, считается, как пул?

  7. igor сказал:

    Если DriverManagerDataSource это который вместе со Spring идет, то он не пул, там в API выделено NOTE: This class is not an actual connection pool; it does not actually pool Connections.

    А BasicDataSource это как раз из апачевской библиотеки пулов к базе.

  8. Владимир сказал:

    Огромное спасибо!!!!!!!!

  9. Владимир сказал:

    Возник еще параллельный вопрос. Вы при добавлении новой записи новый Id получаете сами из своей таблицы sequens, т.е. не автоматически база сама дает id для новой записи?

  10. Николай сказал:

    Спасибо!!!!

    Замечу, что «Note that the base names set as the „basename“ and „basenames“ properties are treated in a slightly different fashion than the „basename“ property of ResourceBundleMessageSource. It follows the basic ResourceBundle rule of not specifying file extension or language codes, but can refer to any Spring resource location (instead of being restricted to classpath resources)» (Spring API) Обратите на это внимание, если придется переделывать из обычного ResourceBundleMessageSource.

  11. Владимир сказал:

    Добрый день

    Вы сможете проконсультировать по iBatis ?

  12. igor сказал:

    Да нет, с iBatis я не знаком.

  13. Владимир сказал:

    Может посоветуете к кому братиться?

  14. Владимир сказал:

    Доюрый вечер.

    Помогите пожалуйста очень срочный вопрос.

    Как использовать библиотеки Spring? нужна только часть биндинга

    т.е. что в JSP прописываались данные через

  15. Роман сказал:

    Странно, но аброкадабра после смены ResourceBundleMessageSource на ReloadableResourceBundleMessageSource с русскими буквами так и осталась. Не подскажете, с чем это может быть связано?

Оставьте свое мнение

XHTML: Вы можете использовать следующие html теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> Если в комментарии пишете XML то вместо "<" используйте "&lt;"

Благодарности, комментарии не по теме и пр. спам ссылками удаляется, к тому же автоматически, можете не стараться.