2009-03-17 5 views
2

J'ai un site Web Java/JSF existant tout le texte à l'écran provient des fichiers de propriétés via < f: loadBundle basename = "org.example.applicaltion" var = "applicaltion"/> qui extrait le texte de applicaltion.properties.Comment remplacer certaines ressources d'un PropertyResourceBundle

Pour un sous-ensemble configurable à l'exécution de ceux-ci je veux tirer la chaîne d'ailleurs où (CMS via des services Web). En regardant la classe ResourceBundle, il semble avoir un infrastructure pour quelque chose de proche avec une délégation à un ResourceBundle parent.

Je suis désireux somethis comme ce

public class Applicaltion extends ResourceBundle{ 
    @Override 
protected Object handleGetObject(String key) { 
    if(overridenKey(key)){ 
     return overridedValue(key); 
    } 
    return null; // ResourceBundle.getObject will delegate to parent 
      // if we return null 
} 
} 

Je l'ai essayé et parent est nul, je suppose que cela est plus utilisé pour le cas de défaut -> fr -> en_GB.

Je considère le pas très attrayante possibilité de voir le fichier de propriété un nom différent de la coutume resourceBundle puis déléguer à travers la pile complète de ResourceBundle.getBundle (PROPERTY_FILE_NAME) .getString (clé) de l'intérieur CustomResourceBundle.handleGetObject (clé).

De meilleures idées?

+0

Je suis toujours à la recherche d'une meilleure réponse à celui-ci, j'accepterai ma propre réponse si je ne reçois pas une meilleure réponse d'ici la fin mars. –

Répondre

1

J'ai fini par résoudre en vérifiant si nous avons eu une valeur de remplacement, si nous ne faisions que le retour, la délégation d'autre à l'ensemble des ressources standards

public class UILabels extends ResourceBundle { 


private ResourceBundle getFileResources(){ 
    return ResourceBundle.getBundle("com.example.web.UILabelsFile", this.getLocale()); 
} 

public Enumeration<String> getKeys() { 
    return getFileResources().getKeys(); 
} 

protected Object handleGetObject(String key) { 
    if(overrideValue(key)){ 
     return getOverridenValue(key); 
    } 
    return getFileResources().getObject(key); 
} 

} 

Notez la légère différence dans la classe de nom est UILabels qui est ce que tous les clients utiliseront le f ile est UILabelsFile pour que le chargeur ResourceBundle ne soit pas récursif.

0

Vous pouvez écrire un PropertyResolver personnalisé, puis exécuter la logique d'où tirer les valeurs de propriété.

Par exemple, vous pouvez définir un bean appelé messageSource et avoir ce chargement up application.properties, plus vos propriétés de CMS ou tout ce que vous avez.

Ensuite, écrire une coutume (il y a un exemple de la façon de le faire avec MessageSource Spring here) et le relier à votre faces-config.xml en utilisant quelque chose comme ceci:

<application> 
<property-resolver> 
     com.package.MessageSourcePropertyResolver 
    </property-resolver> 
</application> 
+0

Merci pour l'idée mais je ferais bien de modifier le chargement des ressources existant fourni via f: loadBundle puis de modifier la résolution des propriétés. Je peux déjà gagner le contrôle programmatique en prolongeant le ResrouceBundle comme dans la question. –

Questions connexes