Freemarker: Comment parcourir la carte en utilisant des enums comme clés
Le code suivant ne fonctionne pas car Freemarker semble fonte de la valeur de l'expression à l'intérieur de [] à la Chaîne et ensuite de l'utiliser comme une clé, ce qui n'est pas ce qui est réellement prévu.
La préparation d'un modèle:
Map<MyEnum, Object> myMap;
myMap.put(MyEnum.FOO, "Foo");
myMap.put(MyEnum.BAR, "Bar");
templateModel.put("myMap", myMap);
mon.ftl:
<#list myMap?keys as key>
<#assign value = myMap[key]>
<li>${key} = ${value}</li>
</#list>
Dans le Freemarker documentationil est décrit comment accéder à la Enum lui-même, mais je n'ai rien trouvé sur comment pour obtenir une valeur de hachage en utilisant Enum comme une clé.
Merci.
source d'informationauteur Alex Vayda
Vous devez vous connecter pour publier un commentaire.
Pour paraphraser Freemarker Documentation FAQ sur ce,
Ainsi, vous pouvez créer un bean qui fournit un moyen pour vous d'obtenir votre Java EnumMap, (j'.e). Ensuite, il vous suffit d'instancier ce bean avec votre mapp, et de mettre la fève dans votre Modèle.
Je suis un peu confus au sujet de quel est l'objectif général de votre tentative d'accomplir. Si vous avez juste besoin de lister les valeurs de l'enum (ou peut-être une valeur d'affichage pour chacun). Il y a un moyen beaucoup plus facile de le faire.
Un sens, je l'ai vu ce problème est résolu en mettant une valeur d'affichage sur le énumérer les instances.
je.e
Ce qui permet de placer le Enum dans votre configuration, et itérer sur toutes les instances.
Ensuite, vous pouvez effectuer une itération sur les enum,
Accepté la réponse n'est pas la solution la plus simple depuis 2.3.22. Alors que
myMap[key]
assume toujours une chaîne de clé (voir l'article de la FAQ pourquoi), maintenant on peut utilisermyMap?api.get(key)
comme une solution de contournement. Elle a besoin d'une configuration de bien:?api
est rejetée par défaut, vous devez définir laapi_builtin_enabled
(Configuration.setAPIBuiltinEnabled(boolean)
) pourtrue
.object_wrapper
(Configuration.setObjectWrapper(ObjectWrapper)
) utilisé doit prendre en charge cette fonctionnalité (exposer l'API). Si vous ne définissez pas laobject_wrapper
n'importe où, puis juste d'augmenter laincompatible_improvements
paramètre (laConfiguration
paramètre du constructeur, ouConfiguration.setIncompatibleImprovements(Version)
) à 2.3.22 résout ce problème. Si vous définissez laobject_wrapper
(c'est à dire, vous les remplacez la valeur par défaut), et c'est unDefaultObjectWrapper
instance, puis remarque queDefaultObjectWrapper
a son propreincompatibleImprovements
de la propriété qui doit être mis à 2.3.22. Si vous utilisez purBeansWrapper
(non recommandé!) ensuite, vous n'avez rien à faire, comme toujours, il prend en charge cette fonctionnalité.