2009-08-18 8 views
0

J'ai implémenté un ActionMapper personnalisé qui obtient les paramètres régionaux à partir de l'URI (l'URI lui-même, pas les paramètres de la requête). Depuis ActionMapper.getMapping(), comment définir les paramètres régionaux pour l'action en cours?Comment définir les paramètres régionaux dans un Struts personnalisé 2 ActionMapper

Voici quelques idées que j'ai pris en compte:.

  • ActionContext.getCurrent() setLocale(). Malheureusement, il semble qu'un nouveau ActionContext nouveau soit créé lorsque l'action est appelée, et les paramètres régionaux sont réinitialisés à leur valeur par défaut.
  • Définissez le paramètre request_locale, qui sera traité par l'intercepteur i18n. Malheureusement, l'intercepteur i18n insiste sur la définition des paramètres régionaux non seulement pour l'action en cours, mais également pour la session en cours, ce qui génère une exception car les sessions ne sont pas activées pour mon application.
  • Définissez un paramètre et traitez-le dans l'action elle-même, en implémentant setLocale(). Simple, mais cela signifie qu'aucun des intercepteurs n'aura accès aux paramètres régionaux.
  • Définissez un paramètre et écrivez un intercepteur (pour faire essentiellement la même chose que l'intercepteur i18n sans assumer le support de la session). On dirait que c'est trop simple pour un problème aussi simple, sans parler de réinventer la roue.

Existe-t-il un moyen simple d'y parvenir?

+0

Si vous avez besoin des paramètres régionaux tout au long de vos intercepteurs, je pense que vous êtes coincé réinventer la roue avec un intercepteur i18n personnalisé. Je suis surpris que l'ActionContext soit recréé - je pensais que votre première idée aurait aussi fonctionné. – Pat

Répondre

0

J'ai effectivement fini par définir un paramètre "locale", et réécrire l'intercepteur i18n l'utiliser.

Depuis Struts 2.1.1, les paramètres de l'objet ActionMapping sont conservés séparément des paramètres de la requête. L'intercepteur actionMappingParams prend ces paramètres et les applique à l'objet action. Cependant, je voulais que mon intercepteur i18n consommer les paramètres « locale » et pas passe à travers l'action, voici comment je l'ai fait:

private static final String LOCALE_PARAMETER = "locale"; 

public String intercept(ActionInvocation invocation) throws Exception { 
    ActionMapping mapping = (ActionMapping) invocation.getInvocationContext() 
     .get(ServletActionContext.ACTION_MAPPING); 
    Map params = mapping.getParams(); 
    Locale locale = (Locale) params.remove(LOCALE_PARAMETER); 

    if(locale != null) { 
     ActionContext.getContext().setLocale(locale); 
    } 

    return invocation.invoke(); 
} 

intercepteur i18n personnalisé doit venir avant actionMappingParams dans la pile d'intercepteurs .

1

vous pouvez utiliser le fourni I18nInterceptor lorsque vous définissez le param: request_only_locale

au lieu de request_locale

request_only_locale stocke les paramètres régionaux uniquement pour les demandes et ne touche pas la session.

Cheers, Christian

+0

Bonne solution. Je devine que ce n'était pas disponible dans n'importe quelle version de Struts2 que j'utilisais au moment où j'ai posé la question originale (puisque je suis sûr que j'ai traversé la source I18nInterceptor). –

Questions connexes