2016-04-16 2 views
0

は私がPlaceHoldersを使用しようとしましたが、私はそれがPropertiesファイルからロードする必要があります知っています。ロケールを変更しても、ほかに私は実行時にBeanとしてそれをロードするために持っているので、それはこれだけデフォルトLocaleで1回ロードされます、それはLocale>en_USリソースとPropertyPlaceholderConfigurerからのSpring RequestMapping?私は現在<code>Locale</code></p> <p>に応じて可変であることを<code>Resources</code>ファイルからURLのため<code>RequestMapping</code>をやろうとしている

デフォルトから任意のアイデアをロードを続けるのだろうか?

マイしようとします。

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"; 
} 
+0

リクエスト中にロケールを変更しますか?これは、applicationContextの作成中にプレースホルダが置き換えられるため可能ではありません。異なる値でリフレッシュするには、すべてをリフレッシュする必要があります。 – dambros

+0

@dambros私は現在のロケールに応じて適切なリソースから '$ {url.controller1}' URLをロードしたいので、ロケールが 'en'で' url.controller1 = aa'の場合は 'requestmap '自動的に/ aaになり、ロケールが' ab'で 'url.controller1 = test'の場合は' requestmap'が '/ test'となります。 – Jason4Ever

+0

アプリケーションの起動中にプロファイル経由で簡単に実行できますが、実行中は変更できなくなります。それは大丈夫ですか?その場合、私はあなたにいくつかの例を示すことができます – dambros

答えて

0

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/