Spring RequestMapping из ресурсов и PropertyPlaceholderConfigurer?
Я пытаюсь сделать RequestMapping
для URL из Resources
файл должен быть переменным в соответствии с текущим Locale
Я пытался использовать PlaceHolders
но я знаю, что это должно загрузить из Properties
файлы в дополнение к я должен загрузить его как Bean
во время выполнения, таким образом, он будет загружаться только один раз со значением по умолчанию Locale
так что даже если изменился Locale, он продолжит загрузку со значения по умолчанию Locale
> en_US
Есть идеи?
Мои попытки:
public class CustomPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
setProperties(convertResourceBundleToProperties(ResourceBundle.getBundle("urls", LocaleContextHolder.getLocale())));
super.postProcessBeanFactory(beanFactory);
}
}
и зовет в Bean
:
@Bean
public CustomPropertyPlaceholderConfigurer CustomPropertyPlaceholderConfigurer(){
return new CustomPropertyPlaceholderConfigurer();
}
Ресурсы urls_ab.properties
:
url.controller1=test
Контроллер:
@RequestMapping(value = "/${url.controller1}", method = RequestMethod.GET)
public String dd(ModelMap model){
return "__front_container";
}
1 ответ
Когда вы вносите изменения в файлы свойств, которые поддерживают PropertyPlaceholderConfigurer, вам нужно будет "обновить" приложение, чтобы изменения вступили в силу. Если вы используете ConfigurableApplicationContext в качестве контекста, вы можете вызвать обновление для своего контекста. Проблема в том, что в веб-приложении вы будете зависеть от вашего web.xml, а не напрямую от объекта контекста, поэтому для обновления новых / обновленных свойств потребуется перезапуск приложения... или выполнение множества ненужных циклов. Рассмотрим приведенный ниже пример в приложении Spring Webflow. Локаль обновляется с помощью перехватчика.:
public class MyLocaleChangeInterceptor extends org.springframework.web.servlet.i18n.LocaleChangeInterceptor {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
Locale locale = (Locale) WebUtils.getSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME);
if (locale != null) {
try {
response.setLocale(locale);
} catch (Exception ex) {
response.setLocale(Locale.ENGLISH);
}
} else {
response.setLocale(Locale.ENGLISH);
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
}
super.postHandle(request, response, handler, modelAndView);
}
}
/** https://gist.github.com/jkuipers/3537965 Spring LocaleResolver that uses cookies but falls back to the HTTP Session when cookies are disabled*/
public class MyCookieLocaleResolver extends CookieLocaleResolver {
private SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
@Override
protected Locale determineDefaultLocale(HttpServletRequest request) {
return sessionLocaleResolver.resolveLocale(request);
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
if (locale != null) {
try {
response.setLocale(locale);
} catch (Exception ex) {
response.setLocale(Locale.ENGLISH);
}
} else {
response.setLocale(Locale.ENGLISH);
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
}
super.setLocale(request, response, locale);
sessionLocaleResolver.setLocale(request, response, locale);
}
@Override
public void setDefaultLocale(Locale defaultLocale) {
sessionLocaleResolver.setDefaultLocale(defaultLocale);
}
}
<!--Then the XML:-->
<bean id="localeChangeInterceptor" class="MyLocaleChangeInterceptor">
<property name="paramName" value="lang"/>
</bean>
<!-- Saves a locale change using a cookie -->
<bean id="localeResolver" class="MyCookieLocaleResolver" >
<property name="defaultLocale" value="en" />
</bean>
<!--Then Spring-webflow specific XML settings:-->
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
<property name="order" value="2"/>
<property name="flowRegistry" ref="flowRegistry" />
<property name="interceptors" >
<list>
<ref local="localeChangeInterceptor" />
</list>
</property>
<property name="defaultHandler">
<bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
</property>
</bean>
Если используется Spring MVC (без Spring Webflow), см. Здесь для блестящего решения: Spring MVC LocaleChangeInterceptor на основе аннотаций не работает
MyKong также предлагает хорошее решение: http://www.mkyong.com/spring-mvc/spring-mvc-internationalization-example/