Question

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

Pour un sous-ensemble configurable à l'exécution, je souhaite extraire la chaîne ailleurs (CMS via des services Web). En regardant la classe ResourceBundle, il semblerait qu’il existe un système d’infrastructure similaire à celui-ci, avec délégation à un parent ResourceBundle.

Je veux quelque chose comme ça

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
}
}

J'ai essayé ceci et le parent est nul, je suppose que c'est plus utilisé dans le cas de default - > en - > en_GB.

J'envisage l'option peu attrayante consistant à attribuer à la propriété un nom différent de celui de resourceBundle personnalisé, puis à déléguer via la pile complète de ResourceBundle.getBundle (PROPERTY_FILE_NAME) .getString (clé) à partir de CustomResourceBundle.handleGetObject (clé) .

De meilleures idées?

Était-ce utile?

La solution

J'ai fini par résoudre ce problème en vérifiant si nous avions une valeur de substitution, si nous le renvoyions, sinon en déléguant au groupe de ressources standard

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 que la légère différence dans la classe de noms est UILabels. Tous les clients utiliseront le fichier UILabelsFile afin que le chargeur ResourceBundle ne soit pas récursif.

Autres conseils

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

Par exemple, vous pouvez définir un bean appelé messageSource et charger ce fichier application.properties, ainsi que les propriétés de votre système de gestion de contenu ou ce que vous avez.

Ensuite, écrivez une personnalisation PropertyResolver (voici un exemple de procédure à suivre avec MessageSource de Spring ici ) et associez-le à votre faces-config.xml en utilisant quelque chose comme ceci:

<application>  
<property-resolver>  
      com.package.MessageSourcePropertyResolver  
   </property-resolver>  
</application>   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top