Интернационализация JSP Spring с использованием OSGi в качестве смены языка службы не работает должным образом

Прежде всего! Не осуждайте меня за то, что я использую MessageSource как сервис. Так как я нахожусь на этапе изучения OSGi и Spring.

У меня есть проект, в котором много модулей на своих страницах, так как я делаю для него интернационализацию. Я увидел, что они используют одни и те же сообщения, поэтому я поместил коды в общий модуль, который использует каждый модуль. И я поделился сообщением как сервис osgi-context.xml:

<osgi:service ref="messageSource" interface="org.springframework.context.support.ReloadableResourceBundleMessageSource"/>
<osgi:service ref="localeResolver" interface="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
<osgi:service ref="localeChangeInterceptor" interface="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>

и в module-context.xml bean-компоненты:

<bean id="messageSource" scope="bundle" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
    <property name="defaultEncoding" value="UTF-8" />
</bean>

<bean id="localeResolver" scope="bundle"
      class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="et" />
</bean>

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

в модуле, использующем сервис:

<osgi:reference id="messageSource" interface="org.springframework.context.support.ReloadableResourceBundleMessageSource"/>
<osgi:reference id="localeResolver" interface="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
<osgi:reference id="localeChangeInterceptor" interface="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>

Так интернационализация работает! Но не полностью... проблема возникает, когда я пытаюсь изменить локаль, это частично работает. Страницы jsp, на которых я использую сообщение тега, например:

<spring:message code="general.welcome"/>

Это не меняется! Но в то же время я передаю некоторые переводы с помощью контроллера в переменную JavaScript, например:

//Некоторая страница.jsp

<script>
    translations = ${translations == null? '{}' : translations};
</script>

Поскольку контроллеры подключены к источнику сообщений:

@Autowired
MessageSource messageSource;
...
//the way that the request is returned by a method
//A map in JSON using messageSource is return 
model.addAttribute("translations", someJSONmap);

Это работает!

Таким образом, в контроллере изменение локали работает, а на страницах JSP - нет.

Кто-нибудь знает, что мне не хватает? Или как это исправить?

Спасибо, что дочитали до сюда и извините за длинный вопрос.


person korogui    schedule 16.08.2013    source источник


Ответы (1)


Проблема решилась удалением службы:

модуль-контекст.xml:

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

osgi-контекст.xml:

<osgi:service ref="localeChangeInterceptor" interface="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>

и поместите его в модуль, использующий сервис, applicationContext.xml:

<mvc:interceptors>
    ...
    <bean id="localeChangeInterceptor"
      class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang" />
    </bean>
</mvc:interceptors>
person korogui    schedule 19.08.2013