web-dev-qa-db-fra.com

Comparer les constantes d'énum dans thymeleaf

J'ai un enum, Constants:

enum Constants {
    ONE,TWO,THREE;
}

Comment puis-je comparer les constantes enum dans Thymeleaf. 

Merci.

30
user3128455

Pour comparer avec une constante enum, utilisez le code suivant:

th:if="${day == T(my.package.MyEnum).MONDAY}"
71
Nick

Une autre façon:

th:if="${constant.name() == 'ONE'}"

Il est plus court mais permet une comparaison avec la représentation des chaînes, ce qui peut poser problème lors du refactoring. 

28
TachikomaGT

@Nick answer a une petite erreur de syntaxe, il manque une accolade finale. CA devrait etre 

th:if="${day == T(my.package.MyEnum).MONDAY}"
7
geoff.weatherall
th:if="${#strings.toString(someObject.constantEnumString) == 'ONE'}">
6
user3128455

Une autre option consiste à utiliser la méthode name () de l'énum dans un commutateur. Un exemple serait:

  <th:block th:switch="${imageType.name()}>
     <span th:case="'ONE'"></span>
     <span th:case="'TWO'"></span>
     <span th:case="'THREE'"></span>
  </th:block>

Il ressemble à un commutateur Java swith ENUM au lieu d’autres réponses telles que ${day == T(my.package.MyEnum).MONDAY} ou ${#strings.toString(someObject.constantEnumString) == 'ONE'}, ce qui est très étrange.

4
Pau

Essaye ça : 

th:if="${ day.toString() == 'MONDAY'}"
2
Dilip Dalwadi

J'ai tendance à ajouter des méthodes isXXX() à mes énumérations:

enum Constants {
    ONE,TWO,THREE;
    public boolean isOne() { return this == ONE; }
    public boolean isTwo() { return this == TWO; }
    public boolean isThree() { return this == THREE; }
}

Ensuite, si value est une instance de votre enum, vous pouvez utiliser th:if="${value.one}".

1
megaflop

Si vous ne voulez pas convertir votre enum en chaîne dans votre objet, vous pouvez le faire comme ceci:

th:if="${#strings.defaultString(someObject.myConstant, 'DEFAULT_VALUE') == 'ONE'}"
1
Vegard

Je préfère utiliser wrapper autour de l'énum. 

public class ConstantsWrapper {
    public static final instance = new ConstantsWrapper();
    public Constants getONE() { return Constants.ONE }
    public Constants getTWO() { return Constants.TWO }
    public Constants getTHREE() { return Constants.THREE }
} 

La prochaine étape consiste à ajouter une nouvelle instance de Wrapper dans les modèles

models.add("constantsWrapper", ConstantsWrapper.instance);

Vous avez maintenant accès sécurisé dans le modèle thymeleaf à chaque valeur de Constants.

th:if="${value == constantsWrapper.getONE()}"

Je sais que cette solution doit écrire plus de code source et créer un seul instnace. Advantage est plus sûr en termes de type que d’appel T() et écrit le nom complet qualifié directement dans le modèle. Avec cette solution, vous pouvez refactoriser sans tester vos modèles.

0
LuiGi