web-dev-qa-db-fra.com

Spring Boot bind @Value to Enum insensible à la casse

Enum

public enum Property {
    A,
    AB,
    ABC;
}

Champ

@Value("${custom.property}")
protected Property property;

application.properties (minuscule)

custom.property=abc

Quand j'exécute une application, j'ai une erreur:

Impossible de convertir la valeur de type [Java.lang.String] en type requis [com.xxx.Property]: aucun éditeur ni conversion correspondante stratégie trouvée.

Considérant que (majuscule):

custom.property=ABC

Fonctionne bien. 

Y at-il un moyen de lier la valeur insensible à la casse? Comme ABC, Abc, AbC, abc, tout modèle devrait fonctionner.

Remarque: j'ai vu cette question - Spring 3.0 MVC binding Enums Case Sensitive mais dans mon cas, j'ai plus de 10 énums/valeurs (et espère avoir plus) classes et à implémenter 10 différents classeurs de propriété personnalisée serait pénible, je besoin d'une solution générique.

12
Mikhail Kholodkov

Les fonctions @Value et @ConfigurationProperties ne correspondent pas. Je ne saurais trop insister sur la supériorité de @ConfigurationProperties

Tout d’abord, vous devez concevoir votre configuration dans un simple POJO que vous pouvez injecter où vous voulez (au lieu d’avoir des expressions dans les annotations que vous pouvez facilement briser avec une faute de frappe). Deuxièmement, la prise en charge des méta-données signifie que vous très facilementobtenez la complétion automatique dans votre IDE pour vos propres clés .

Et enfin, la liaison relâchée décrite dans la doc ne s'applique qu'à @ConfigurationProperties. @Value est une fonctionnalité de Spring Framework et ignore les liaisons détendues. Nous avons l’intention de préciser cela dans la doc .

TL; DR abc fonctionne avec @ConfigurationProperties mais pas avec @Value.

13
Stephane Nicoll

Les valeurs sont sensibles à la casse (considérez les clés ou les mots de passe injectés à partir de l'environnement), et la liaison relâchée ne s'applique qu'aux clés. Les noms Java enum sont également sensibles à la casse (A et a sont des valeurs distinctes), et vous ne voudriez pas écraser la casse. 

Utilisez simplement la casse appropriée dans vos propriétés de configuration. 

3
chrylis