2010-01-17 12 views
3

Considérons la classe suivante DialgBean.java, qui définit les propriétés d'une boîte de dialogue sur une page Web. Ci-dessous la classe et sa définition de haricotInjection dynamique de propriétés de bean basées sur une variante de locale au printemps

public class DialogBean{ 
    private int height; 

    public void setHeight(int height) 
    ... 
} 

<bean id="dialogBean" class="org.springhelp.DialogBean"> 
<property name="height" value="${dialogBean.height}"/> 
... 
</bean> 

Dans l'exemple ci-dessus, vous pouvez voir que la propriété de la hauteur de DialogBean est en cours de récupération par un PropertyPlaceholderConfigurer.

Le problème est que l'application sur laquelle je travaille prend en charge plusieurs clients, et la plupart des clients ont des exigences distinctes pour le paramètre height d'une boîte de dialogue. Par conséquent, je ne peux pas simplement tirer le paramètre height d'un fichier de propriétés. Alors, comment injecter un paramètre de hauteur spécifique à un client dans un DialogBean en utilisant la définition de bean décrite ci-dessus, où l'identifiant client est stocké comme variante dans l'objet java.util.Locale?

Existe-t-il un moyen de transmettre à une fabrique de haricots personnalisée des données d'exécution post-processeur telles que les paramètres régionaux?

+1

Faut-il vraiment être «final»? Cela ne compilerait pas. – BalusC

+0

Voir http://stackoverflow.com/questions/2037712/getting-spring-ioc-to-work-with-the-mvp-pattern/2037958#2037958 – axtavt

+0

Je suis habitué à rendre les choses finales ... évidemment la finale est incorrect –

Répondre

1

Le plus simple, mais une solution plus lourde, est

  • déclarer une fève par variante locale et étendent à partir d'une graine de parent (base).
  • créer une enveloppe mince pour la BeanFactory qui accepte les paramètres régionaux
  • sur recherche pour un haricot à base de paramètres régionaux, l'emballage crée des options de nom de haricots du nom de haricot parent (base) et la Locale
  • traverse sur la liste des définir les noms de bean et trouver le premier qui correspond à la liste des options de noms créés.

Bien sûr, la liste des options doit être par ordre de priorité.

1

On dirait que vous avez besoin d'un ResourceBundle ou, au printemps, d'un MessageSource. Injectez cela dans votre bean et résolvez par programme la valeur que vous voulez au moment de l'exécution.

MessageSource peut envelopper le ResourceBundle de base, et est beaucoup plus facile à utiliser.

+0

Merci pour la solution proposée, et théoriquement cela fonctionnera. Mais, au prix de coupler étroitement les pojos avec le printemps. En outre, cette approche nécessiterait des recherches programmatiques redondantes pour chaque propriété de bean dans la classe DialogBean, ce qui ajoutera à la verbosité et à la maintenance d'un objet autrement simple. Et, le moulage de type devra être fait à la main car le MessageSource ne gère que les chaînes –

+0

Tout est vrai, oui, mais je ne vois aucune autre option. Les haricots de printemps sont effectivement statiquement câblés, et bien qu'il y ait quelques trucs que vous pouvez tirer avec des haricots à la demande, je ne ferais pas ça dans cette situation. – skaffman

+0

Le seul compromis que je peux penser en ce moment est de déclarer un bean de dialogue par défaut, qui servira de parent à tous les beans spécifiques au client; encapsulez la recherche des beans derrière une fabrique personnalisée qui tente de résoudre le bean spécifique du client. L'état d'échec étant la définition du bean de dialogue parent par défaut –