7
votes

JSF 2 localisation (haricot géré)

J'ai un fichier de propriétés pour la localisation:

FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "There was an error saving this widget.", null);
FacesContext.getCurrentInstance().addMessage(null, message);


0 commentaires

5 Réponses :


0
votes

Voici un exemple sur la façon de faire cela: http://www.laliluna.de/articles/ Javaserver-Faces-Message-Resource-Bundle-Tutorial.html

Vous souhaitez jeter un coup d'œil sur la ressourcebundle.getbundle () partie.

salutations, Lars


3 commentaires

J'ai vu cela quand je l'ai googlé. Cependant, y a-t-il un moyen plus élégant d'avoir le conteneur injecter cela à l'aide de @Resource ("# {msgs}") ou quelque chose comme ça? Je suppose que depuis que j'utilise CDI, je pourrais créer un producteur de @MessageBundle ou quelque chose, puis transmettez simplement une propriété objet ...


J'ai utilisé cette approche dans l'un de nos derniers projets - nous avons eu le problème identique aux erreurs de DB. Je peux jeter un coup d'œil à l'ancienne source mercredi la semaine prochaine si cela est toujours non résolu.


Vous avez raison que c'est un moyen valide de le faire. Je me demandais simplement s'il y avait un moyen de le faire plus élégamment. Je peux simplement utiliser CDI pour l'injecter. Cela fonctionnera s'il n'y a pas d'annotation intégrée.



17
votes

J'ai posé une question assez connexe sur SO: Comment injecter un non- classe sérialisable (comme java.util.resourcebundle) avec Soudure

et à l'intérieur du forum de couture: http://seamframework.org/community/howtocreeantanInjectAbletsourcebundlewithweld P>

Résumée: J'ai réalisé une ressource injectableBundle avec 3 producteurs. D'abord, vous avez besoin d'un facescontextProducer. J'ai pris celui des sources alpha de couture 3. P>

@Named
public class MyBean {
  @Inject
  private transient ResourceBundle bundle;

  public void testMethod() {
    bundle.getString("SPECIFIC_BUNDLE_KEY");
  }
}


0 commentaires

2
votes

Il est plus facile d'utiliser E.G. Le module de message de myFaces Codi !


0 commentaires

2
votes

Vous pouvez le faire avec JSF seul.

Commencez par définir une propriété gérée sur votre haricot de support. Dans la configuration JSF, vous pouvez définir la valeur de la propriété gérée sur une expression El qui fait référence à votre ensemble de ressources.

J'ai fait quelque chose comme les suivants à l'aide de Tomcat 6. La seule mise en garde est que vous ne pouvez pas Accédez à cette valeur de votre constructeur de haricot de support, car JSF n'aura pas encore initialisé. Utilisez @postConstruct sur une méthode d'initialisation si la valeur est nécessaire tôt dans le cycle de vie du bean. xxx

Ceci présente l'avantage de faire des méthodes de haricot de support moins dépend de la technologie de présentation, il devrait donc être plus facile de tester. Il découle également votre code des détails comme le nom donné au nom de l'ensemble.

Certains tests utilisant Mojarra 2.0.4-B09 affichent une petite incohérence lorsqu'un utilisateur change la mi-session. Les expressions EL à la page utilisent les nouveaux paramètres régionaux mais le haricot de support n'est pas donné la nouvelle référence de ressources de ressources. Pour que cela soit cohérent, vous pouvez utiliser la valeur de la propriété Bean dans El Expressions, telles que l'utilisation de # {backingbean.messages.greeting} à la place de # {msgs.greeting} . Ensuite, la page El et la haricot de support utiliseraient toujours les paramètres régionaux actifs lorsque la session a commencé. Si les utilisateurs avaient pour commuter les paramètres régionaux de la session et obtenir les nouveaux messages, vous pouvez essayer de faire une graine de demande de requête et lui donner des références à la fois au beuge de session et à la botte de ressources.


1 commentaires

Dans JSF2, vous pouvez simplement utiliser @ManageDProperty ("# ​​{msgs}") msg ​​de ressources privées; (avec setter).



0
votes

C'est une ancienne question mais j'ajoute une autre façon de le faire. Je cherchais quelque chose d'autre et je suis rentré à travers cela. Les méthodes ici semblaient toutes convoluées pour quelque chose qui ne me frappe pas comme tout ce qui est difficile. Jouer avec Glitter parce que c'est joli si vous me demandez.

donné un fichier: p> xxx pré>

à l'intérieur du fichier: p> xxx pré>

i crée une méthode "getBundle ()" Puisque j'aime attraper le temps d'exécution et ajouter un message significatif afin que je comprendrai d'où cela vient. Pas difficile et peut aider si vous obtenez le caprice de jeu avec les fichiers de propriétés pour une raison quelconque et ne vous mettez pas à jour correctement. Je fais parfois ce privé car il s'agit parfois d'une méthode d'assistance dans une classe (pour moi). Cela empêche l'essai d'attraper l'encombrement du code significatif. P>

L'utilisation du chemin complet du fichier vous permet de le mettre quelque part autre que l'emplacement / le répertoire par défaut si vous avez d'autres idées sur l'organisation. P >

public/private ResourceBundle getMessageResourceBundle(){
    String messageBundle = "com.full.package.path.to.messages.errormessages";
    ResourceBundle bundle = null;
    try{
        bundle = ResourceBundle.getBundle(messageBundle);
    }catch(MissingResourceException ex){
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,
                    "Unable to find message bundle in XYZ Class", ex);
        throw ex;
    }

}

public void doSomethingWithBundle(){

    ResourceBundle bundle = getMessageResourceBundle();
    String someString = bundle.getString("SOME_ERROR_STRING");
    ...
}


1 commentaires

Mais les messages sont récupérés sans prendre en considération les locaux