J'ai un enum, Constants
:
enum Constants {
ONE,TWO,THREE;
}
Comment puis-je comparer les constantes enum dans Thymeleaf.
Merci.
Pour comparer avec une constante enum, utilisez le code suivant:
th:if="${day == T(my.package.MyEnum).MONDAY}"
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.
@Nick answer a une petite erreur de syntaxe, il manque une accolade finale. CA devrait etre
th:if="${day == T(my.package.MyEnum).MONDAY}"
th:if="${#strings.toString(someObject.constantEnumString) == 'ONE'}">
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.
Essaye ça :
th:if="${ day.toString() == 'MONDAY'}"
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}"
.
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'}"
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.