Bonjour,
Pour une application à internationaliser, je dois rendre mes EJB multilingues.
(Pourquoi eux, et pas seulement la partie web? Parce qu'ils sont succeptibles de renvoyer des exceptions métiers dont le contenu sera exploité par l'appelant. Leurs messages dépendent de ce que le serveur d'application jugera utile à un instant donné - lui seul le saura alors -. Cependant l'utilisateur final doit pouvoir le lire ce message, si jamais il devait "lui tomber dessus".)
Tout est ok côté fichiers de ressources, ils sont là déclinés comme il faut. C'est l'invocation proprement dite des EJBs pour servir un appelant étranger (c.à.d. à langue variable) que je dois maintenant étudier.
Ma question: comment traiter le problème simplement?
J'ai quelques centaines d'invocations d'EJB non internationalisés à cet instant. Le plus souvent l'origine d'un premier appel est une page web. Mais un EJB peut appeler un autre EJB pour faire de la composition de service.
1) Une solution serait de placer un paramètre Locale localeUtilisateur dans chaque prototype de méthode dans les EJBs, mais c'est étouffant.
2) Une autre solution serait de dire: à la création de l'EJB, je le crée pour une Locale donnée. Mais là, il faut se défier que pour les EJB stateless, une instance peut se voir réutilisée à l'appel de méthode suivant, alors que l'utilisateur appelant peut très bien avoir une langue différente...
3) Une troisième solution serait de passer par une façade. En disant: avant chaque appel de méthode EJB, je me débrouille pour faire un set de la Locale à utiliser le temps de l'invocation (une instance d'EJB n'étant employée que pour un appel unique à un instant donné, pas de problème de concurrence d'accès sur la langue).
Dans ce cas, cela peut fonctionner sans trop de difficultés pour les invocations initiées côté web, mais dès qu'un EJB A appelle un EJB B pour l'aider à faire son boulot, il faut casser l'invocation B.getInstance().monPetitBoulot(); pour substituer à B.getInstance() un appel de façade.
C'est encore un travail assez important...
Quelle stratégie utiliser pour résoudre ce problème de manière générale?
En vous remerciant,
Partager