web-dev-qa-db-fra.com

Spring Boot: lisez la liste depuis yaml en utilisant @Value ou @ConfigurationProperties

Je veux lire une liste d'hôtes à partir d'un fichier yaml (application.yml), le fichier ressemble à ceci:

cors:
    hosts:
        allow: 
            - http://foo1/
            - http://foo2/
            - http://foo3/

(Exemple 1)

Ma classe utilisée définit la valeur comme ceci:

@Value("${cors.hosts.allow}")   
List<String> allowedHosts;

Mais la lecture échoue car Spring se plaint à ce sujet:

Java.lang.IllegalArgumentException: impossible de résoudre le paramètre fictif 'cors.hosts.allow' dans la valeur de chaîne "$ {cors.hosts.allow}"

Lorsque je change le fichier de cette façon, la propriété peut être lue, mais naturellement, elle ne contient pas la liste mais une seule entrée:

cors:
    hosts:
        allow: http://foo1, http://foo2, http://foo3

(Je sais que je pourrais lire les valeurs sur une seule ligne et les scinder en "," mais je ne souhaite pas encore contourner le problème.) 

Cela ne fonctionne pas non plus (bien que je pense que cela devrait être valable selon la documentation de snakeyamls ):

cors:
    hosts:
        allow: !!seq [ "http://foo1", "http://foo2" ] 

(Sauter le !!seq et simplement utiliser le [/] est aussi un échec)

J'ai lu la suggestion ici qui implique d'utiliser @ConfigurationProperties et de transférer l'exemple à Java et de l'utiliser avec le fichier yaml que vous voyez dans Example1:

@Configuration
@EnableWebMvc
@ConfigurationProperties(prefix = "cors.hosts")
public class CorsConfiguration extends WebMvcConfigurerAdapter {
    @NotNull
    public List<String> allow;
...

Lorsque je lance ceci, je reçois cette plainte:

org.springframework.validation.BindException: org.springframework.boot.bind.RelaxedDataBinder $ RelaxedBeanPropertyBindingResult: 1 erreurs Erreur de champ dans l'objet 'cors.hosts' sur le champ 'autoriser': rejeté valeur [null]; codes [NotNull.cors.hosts.allow, NotNull.allow, NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [cors.hosts.allow, autoriser]; arguments []; message par défaut [permettre]];

J'ai cherché d'autres moyens de configurer mes hôtes CORS et ai trouvé ce problème Problème lié à Spring Boot mais, comme il n'est pas encore terminé, je ne peux pas l'utiliser comme solution ..__ Tout cela est fait avec Spring Boot 1.3 RC1

12
Marged

C'est facile, la réponse est dans ce doc et aussi dans celui-ci

Donc, vous avez un yaml comme ceci:

cors:
    hosts:
        allow: 
            - http://foo1/
            - http://foo2/
            - http://foo3/

Ensuite, vous liez d'abord les données

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import Java.util.List;

@Component
@ConfigurationProperties(prefix="cors.hosts")
public class AllowedHosts {
    private List<String> HostNames; //You can also bind more type-safe objects
}

Ensuite, dans un autre composant que vous venez de faire

@Autowired
private AllowedHosts allowedHosts;

Et vous avez terminé!

3
JeanValjean

utilisez des valeurs séparées par des virgules dans application.yml

corsHostsAllow: http://foo1/, http://foo2/, http://foo3/

Code Java pour l'accès

@Value("${corsHostsAllow}")    
String[] corsHostsAllow

J'ai essayé et réussi;)

3
Ahmet Vehbi Olgaç

J'ai pu lire la liste de propriétés comme ci-dessous façon-

Propriétés-

cors.hosts.allow[0]=Host-0
cors.hosts.allow[1]=Host-1

Lire la propriété-

@ConfigurationProperties("cors.hosts")
public class ReadProperties {
    private List<String> allow;

    public List<String> getAllow() {
       return allow;
    }
    public void setAllow(List<String> allow) {
        this.allow = allow;
    }
}
1
Sanim