4 votes

Spring @Value - Existe-t-il un moyen d'attribuer une carte vide par défaut ?

Situation

J'utilise @PropertySource dans ma classe avec @Value afin d'injecter une valeur dans une carte à partir d'un fichier de propriétés. Le code pour cela est le suivant :

@Value("#{${global.fieldsSubset}}")
private final Map<String, Set<String>> fieldsSubset = new HashMap<>();

Au cas où la propriété requise ne serait pas trouvée, j'aimerais initialiser la carte comme une carte vide. Pour cela j'ai changé le code en :

@Value("#{${global.fieldsSubset : {:}}}")
private final Map<String, Set<String>> fieldsSubset = new HashMap<>();

Problème

Le comportement par défaut fonctionne bien et la carte est vide lorsque la propriété n'est pas trouvée, mais lorsque la propriété est présente, la valeur par défaut reste et la carte est toujours vide.

Voici la classe entière :

@Configuration
@PropertySource(value = "classpath:global.properties", ignoreResourceNotFound = true)
@RefreshScope
public class FieldsSubsetsProperties {
    @Value("#{${global.fieldsSubset:{:}}}")
    private final Map<String, Set<String>> fieldsSubset = new HashMap<>();

    public Map<String, Set<String>> getFieldsSubset() {
        return fieldsSubset;
    }

    public Set<String> getSubsetOfFieldsNames(String subsetName) {
        return fieldsSubset.getOrDefault(subsetName, 
     Collections.emptySet());
    }
}

Voici la valeur de la propriété :

global.fieldsSubset = {\
 'channel-basic':{'id', 'number', 'name'}, \
 'channel':{'id', 'number', 'name', 'description', 'status'}\
}

0voto

Je pense que vous avez 2 erreurs :

  1. Dans la déclaration du champ, l'élément final a tort. Le champ doit être non-final, afin que Spring puisse définir sa valeur après la construction de l'instance du bean.
  2. Le JSON est faux. A Set est mappé à une liste JSON, donc le JSON devrait être i.e. 'channel':['id', 'number', 'name', 'description', 'status'] ce qui signifie que vous devez utiliser des parenthèses au lieu d'accolades pour les valeurs de la carte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X