MessageResourceBundle в Spring

Когда пишешь 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 и т.д. Если к моменту запроса они обновились, то перечитывает заново. И к томуже читает в указанной кодировке, что избавляет нас от запуска всяких лишних программ.

  • http:// Владимир

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

  • http:// igor

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

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

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

  • http:// Владимир

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

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

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

  • http:// Владимир

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

  • http:// 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 без дополнительных настроект у меня хранили русский текст.

  • http:// Владимир

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

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

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

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

  • http:// igor

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

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

  • http:// Владимир

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

  • http:// Владимир

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

  • http:// Николай

    Спасибо!!!!

    Замечу, что «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.

  • http:// Владимир

    Добрый день

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

  • http:// igor

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

  • http:// Владимир

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

  • http:// Владимир

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

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

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

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

  • http:// Роман

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