2015-03-25 3 views
4

У меня проблема с настройкой Spring MessageSource, чтобы игнорировать мой системный язык. Когда я вызываю getMessage с нулевым параметром locale, я хочу, чтобы мой MessageSource выбирал файл свойств свойства default.properties. Вместо этого он выбирает messages_en.properties. Когда я меняю имя этого файла свойств на messages_fr.properties, тогда выбирается файл свойств по умолчанию. Моя локаль системы - «en». Похоже, что MessageSource игнорирует свойство fallbackToSystemLocale, которое я установил в false.Spring MessageSource, похоже, игнорирует свойство fallbackToSystemLocale

Такое же поведение относится к Spring версии 4.1.4, а также к 4.1.5. Конфигурация

MessageSource:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="fallbackToSystemLocale" value="false"></property> 
    <property name="basenames"> 
     <list> 
      <value>locale/messages</value> 
     </list> 
    </property> 
    <property name="defaultEncoding" value="UTF-8"></property> 
</bean> 

Получение сообщения:

String message = messageSource.getMessage("user.email.notFound", new Object[] {email}, null); 

Спасибо за любые советы!

ответ

3

fallbackToSystemLocale является НЕ предназначен, чтобы направить то, что источник сообщения делает, когда вы вызываете их locale=null

fallbackToSystemLocale управления, что делать, когда вы запрашиваете сообщение (код), который не существует для запрашиваемых местного - либо потому что нет свойства сообщений нет файла для языка вообще, или просто потому, что файл сообщений не содержит код сообщения

с другой стороны, когда вы запускаете getMessage с locale=null (messageSource.getMessage("key", null);), то локаль будет установлена ​​Locale.getDefault

org.springframework.context.support.AbstractMessageSource:

protected String getMessageInternal(String code, Object[] args, Locale locale) { 
    ... 
    if (locale == null) { 
     locale = Locale.getDefault(); 
    } 
    ... 

ПЕРЕД fallbackToSystemLocale свойство принимается во внимание.

Therfore easyest взломать -arround (Это не workarround это хак), будет использовать язык, который вы не поддерживаете вместо null: messageSource.getMessage("key", new Locale("XX"));

+0

Спасибо за хороший ответ. Вы не считаете это поведение нелогичным? Я ожидал бы использовать файл свойств сообщения по умолчанию в случае, если указан нулевой языковой стандарт. Если бы я хотел использовать системный локальный, я бы сделал что-то вроде 'messageSource.getMessage (« ключ », locale == null? Locale.getDefault(): locale);'. т. е. Wicket framework решает эту проблему, когда я пишу, и мне кажется лучше. Я, вероятно, расширю класс 'ResourceBundleMessageSource' и переопределяю' getMessageInternal', чтобы отразить мои потребности. Если он не объявлен окончательным, конечно :) –

Смежные вопросы