wake-up-neo.net

Spring Boot: Lesen Sie die Liste von yaml mit @Value oder @ConfigurationProperties

Ich möchte eine Liste von Hosts aus einer Yaml-Datei (application.yml) lesen. Die Datei sieht folgendermaßen aus:

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

(Beispiel 1)

Meine verwendete Klasse definiert den Wert wie folgt:

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

Aber das Lesen schlägt fehl, da Spring darüber klagt:

Java.lang.IllegalArgumentException: Der Platzhalter konnte nicht aufgelöst werden 'cors.hosts.allow' im Stringwert "$ {cors.hosts.allow}"

Wenn ich die Datei so ändere, kann die Eigenschaft gelesen werden, aber natürlich enthält sie nicht die Liste, sondern nur einen Eintrag:

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

(Ich weiß, dass ich die Werte als einzelne Zeile lesen und nach "," aufteilen könnte, aber ich möchte noch keine Problemumgehung durchführen.) 

Dies funktioniert auch nicht (obwohl ich denke, dass dies laut snakeyamls docs gültig sein sollte):

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

(Das Überspringen des !!seq und die Verwendung des [/] ist ebenfalls ein Fehler.)

Ich habe den Vorschlag hier gelesen, in dem @ConfigurationProperties verwendet wird, und das Beispiel nach Java übertragen und mit der yaml-Datei verwendet, die Sie in Beispiel1 sehen:

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

Wenn ich das mache, bekomme ich diese Beschwerde:

org.springframework.validation.BindException: org.springframework.boot.bind.RelaxedDataBinder $ RelaxedBeanPropertyBindingResult: 1 Fehler Feldfehler im Objekt 'cors.hosts' im Feld 'allow': abgelehnt value [null]; codes [NotNull.cors.hosts.allow, NotNull.allow, NotNull]; Argumente [org.springframework.context.support.DefaultMessageSourceResolvable: codes [cors.hosts.allow, allow]; Argumente []; Standardmeldung [ermöglichen]];

Ich habe nach anderen Mitteln gesucht, um meine CORS-Hosts konfigurierbar zu machen, und habe dieses Spring Boot-Problem gefunden. Da dies jedoch noch nicht abgeschlossen ist, kann ich es nicht als Lösung verwenden Booten Sie 1.3 RC1

12
Marged

Es ist einfach, die Antwort ist in diesem doc und auch in diesem

Sie haben also ein Yaml wie folgt:

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

Dann binden Sie zuerst die Daten

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
}

Dann in einer anderen Komponente, die Sie gerade tun

@Autowired
private AllowedHosts allowedHosts;

Und du bist fertig!

3
JeanValjean

verwenden Sie in application.yml kommagetrennte Werte

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

Java-Code für den Zugriff

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

Ich habe es versucht und es geschafft;)

3

Ich konnte die Liste von Eigenschaften wie unten lesen.

Eigenschaften-

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

Eigenschaft lesen-

@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

Ich bin auf dasselbe Problem gestoßen. Aber gelöst, gib dir meine Lösung

exclude-url: >
  /management/logout,
  /management/user/login,
  /partner/logout,
  /partner/user/login

erfolg in der Version von Spring Boot 2.1.6.RELEASE

0
sean teng