PropertyPlaceholderConfigurerをバックアップするプロパティファイルを変更する場合は、変更内容を有効にするためにアプリケーションを更新する必要があります。コンテキストとしてConfigurableApplicationContextを使用する場合は、あなたのコンテキストでrefreshを呼び出すことができます。課題は、Webアプリケーションではコンテキストオブジェクトに直接依存するのではなく、新しい/更新されたプロパティを読み込むためにアプリケーションを再起動する必要があります。 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>
スプリングMVC(バネのWebflowせず)を使用した場合は、華麗な溶液のためにここで参照:Spring MVC LocaleChangeInterceptor annotation based doesn't work
MyKongもA提供良い解決策:http://www.mkyong.com/spring-mvc/spring-mvc-internationalization-example/
リクエスト中にロケールを変更しますか?これは、applicationContextの作成中にプレースホルダが置き換えられるため可能ではありません。異なる値でリフレッシュするには、すべてをリフレッシュする必要があります。 – dambros
@dambros私は現在のロケールに応じて適切なリソースから '$ {url.controller1}' URLをロードしたいので、ロケールが 'en'で' url.controller1 = aa'の場合は 'requestmap '自動的に/ aaになり、ロケールが' ab'で 'url.controller1 = test'の場合は' requestmap'が '/ test'となります。 – Jason4Ever
アプリケーションの起動中にプロファイル経由で簡単に実行できますが、実行中は変更できなくなります。それは大丈夫ですか?その場合、私はあなたにいくつかの例を示すことができます – dambros