i18n с Spring MVC, пропустите RequestMapping - PullRequest
1 голос
/ 04 февраля 2012

Я настроил i18n для своего веб-приложения с помощью Spring. Он работает нормально. Но у меня проблема. Когда я нажимаю ссылку на другой язык, скажем, на странице edit_user.URL запроса генерируется как «/edit_user.htm?lang=de». Класс контроллера получает этот запрос и запускает метод editUser на основе @RequestMapping(value = { "edit_user" }).Как этого избежать. Я просто хочу, чтобы мое веб-приложение могло просто менять локаль, не достигая методов класса контроллера при нажатии на «изменить ссылки на язык».Мой spring-config-servlet.xml выглядит следующим образом.

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

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

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

    <bean id="handlerMapping"
        class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="interceptors">
            <ref bean="localeChangeInterceptor" />
        </property>
    </bean>

    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate" />

    <bean
        class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1" />
        <property name="mediaTypes">
            <map>
                <entry key="pretty" value="text/html" />
                <entry key="json" value="application/json" />
                <entry key="xml" value="application/xml" />
            </map>
        </property>
        <property name="defaultViews">
            <list>
                <bean
                    class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                    <constructor-arg>
                        <bean class="org.springframework.oxm.xstream.XStreamMarshaller" />
                    </constructor-arg>
                </bean>
            </list>
        </property>
        <property name="ignoreAcceptHeader" value="true" />
    </bean>

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="order" value="2" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean
        class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            ....
        </property>
        <property name="defaultErrorView" value="errorPage" />
    </bean>

1 Ответ

2 голосов
/ 04 февраля 2012

Хм ... Интересно.

UserController класс получает этот запрос:

<a href="?lang=en">en</a> | <a href="?lang=de">de</a> 

для URL http://www.example.com/AppName/User/edit_user.htm?lang=de и запустите метод editUser.

Но вы можете изменить свои ссылки на:

<a href="<c:url value="/?lang=en" />">EN</a> | <a href="<c:url value="/?lang=de" />">DE</a>

и теперь, когда пользователь нажимает ссылку на другой язык HomeController класс получает запрос /?lang=de, веб-приложение меняет локаль и перенаправляет пользователя на корневую страницу http://www.example.com/AppName/?lang=de.

Является ли это поведение приемлемым для вашего приложения?

В противном случае, я думаю, вам нужно отфильтровать параметры запроса для всех классов контроллеров, если вы хотите найти другое решение.

...