2010-01-18 5 views
3

Est-il possible, avec les regroupements de ressources et MessageFormat, d'avoir le résultat suivant?Test du paramètre null dans le fichier .properties pour MessageFormat

  • quand je l'appelle getBundle("message.07", "test") pour obtenir "Group test"
  • quand je l'appelle getBundle("message.07", null) pour obtenir "No group selected"

Chaque exemple que je trouve sur Internet est avec des planètes, avec des fichiers sur le disque et ainsi de suite.

J'ai seulement besoin de vérifier si un paramètre est null (ou n'existe pas) dans le fichier de propriétés du groupe de ressources. J'espère trouver un format spécial pour le paramètre null quelque chose comme {0,choice,null#No group selected|notnull#Group {0}}.

La méthode que j'utiliser pour obtenir les faisceaux est:

public String getBundle(String key, Object... params) { 
    try { 
    String message = resourceBundle.getString(key); 
    if (params.length == 0) { 
     return message; 
    } else { 
     return MessageFormat.format(message, params); 
    } 
    } catch (Exception e) { 
    return "???"; 
    } 
} 

Je demande également cette méthode pour d'autres faisceaux, comme

  • getBundle("message.08", 1, 2) =>"Page 1 of 2" (toujours les paramètres, pas besoin de vérifier null)
  • getBundle("message.09") =>"Open file" (aucun paramètre, pas besoin de vérifier null)

Que dois-je écrire dans mon fichier .properties pour message.07 pour avoir le résultat décrit?
Ce que je commence maintenant:

message.07=Group {0} 
message.08=Page {0} of {1} # message with parameters where I always send them 
message.09=Open file   # message without parameters 
+0

Vérifiez mes modifications. –

+0

Il semble que la réponse à ma question est qu'il n'y a pas de format spécial pour un 'String' passé à' MessageFormat' pour vérifier si un paramètre est 'null'. –

Répondre

0

Votre fichier .properties,

message.07=Group {0} 
message.08=Page {0} of {1} 
message.09=Open file 
message.null = No group selected 

Et vous devez changer votre code pour mettre un contrôle explicite params pour null. Et si null alors vous pouvez faire quelque chose comme resourceBundle.getString(NULL_MSG). Où NULL_MSG sera cela,

private static final String NULL_MSG = "message.null"; 

Donc, maintenant votre méthode originale deviendrait quelque chose comme ça.

public String getBundle(String key, Object... params) { 
    String message = null; 
    try { 
    if (params == null) { 
     message = resourceBundle.getString(NULL_MSG); 
    } else { 
     message = MessageFormat.format(resourceBundle.getString(key), params); 
    } 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
    return message; 
} 

Appel ma méthode comme ci-dessous,

getBundle("message.07", "test") // returning 'Group test' 
getBundle("message.07", null) // returning 'No group selected' 
getBundle("message.08", 1, 2) // returning 'Page 1 of 2' 
getBundle("message.08", null) // returning 'No group selected' 
getBundle("message.09", new Object[0]) // returning 'Open file' 
getBundle("message.09", null) // returning 'No group selected' 

Maintenant, dites-moi où est le problème?

+0

Je ne voudrais pas changer cette méthode, car elle est utilisée partout dans mon code et elle devrait fonctionner avec le reste des messages (où les paramètres sont des nombres, des chaînes ...) où je n'ai pas besoin de vérifier ' null'. Il est également possible d'avoir plus de cas comme celui-ci (plus de messages avec un test nul) –

+0

Il ne casserait pas le code n'importe où, il suffit de changer le comportement interne. Les paramètres ne sont pas modifiés, ni le type de retour. Je ne vois aucun problème. –

+0

Vous n'avez pas besoin de la clé supplémentaire pour chaque message. Faites juste un générique pour 'null'. Cela suffira, AFAICS. De plus, vérifiez mes modifications. –

1

Je vous recommande de ne pas essayer de modifier la fonctionnalité de bundle (même si vous avez une méthode getBundle l'encapsulant).

Il suffit de faire dans votre code:

getBundle(param == null? "message.07.null": "message.07", param) 

Ou faire une autre méthode:

getBundleOrNull("message.07", param, "message.07.null") 

cela ne

public String getBundleOrNull(String key, value, nullKey) { 
    return getBundle(value == null? nullKey: key: value); 
} 
+0

Merci pour votre réponse. Je choisirai de faire quelque chose qui soit une combinaison de votre réponse et celle de Vinegear, et il est difficile de choisir une réponse acceptée. Je voterai votre réponse, de toute façon. –

+0

Merci. Bonne chance! – helios

Questions connexes