web-dev-qa-db-ja.com

Spring Boot:@Valueまたは@ConfigurationPropertiesを使用してyamlからリストを読み取る

Yamlファイル(application.yml)からホストのリストを読みたいのですが、ファイルは次のようになります。

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

(例1)

使用される私のクラスは、このような値を定義します:

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

しかし、Springがこれについて不平を言っているため、読み取りは失敗します。

Java.lang.IllegalArgumentException:文字列値「$ {cors.hosts.allow}」のプレースホルダー「cors.hosts.allow」を解決できませんでした

このようにファイルを変更すると、プロパティを読み取ることができますが、当然リストには含まれず、1つのエントリのみが含まれます。

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

(値を1行として読み取り、","で分割できることは知っていますが、まだ回避策を取りたくありません)

これも機能しません(これは snakeyamls docs に従って有効であると思いますが)。

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

!!seqをスキップし、[/]を使用するだけでも失敗です)

私は提案を読みました here これは@ConfigurationPropertiesを使用することを含み、例をJavaに転送し、Example1で見るyamlファイルで使用しました:

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

これを実行すると、この苦情が表示されます。

org.springframework.validation.BindException:org.springframework.boot.bind.RelaxedDataBinder $ RelaxedBeanPropertyBindingResult:1エラーフィールド 'allow'のオブジェクト 'cors.hosts'のフィールドエラー:拒否された値[null];コード[NotNull.cors.hosts.allow、NotNull.allow、NotNull];引数[org.springframework.context.support.DefaultMessageSourceResolvable:コード[cors.hosts.allow、allow]; arg [];デフォルトメッセージ[許可]];

私はCORSホストを構成可能にする他の手段を検索し、これを見つけました Spring Boot issue しかし、これはまだ完了していないため、ソリューションとして使用できません。これはすべて、Spring Boot 1.3 RC1で行われます

13
Marged

簡単です。答えはこの docthis one にあります

だから、あなたはこのようなyamlを持っています:

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

次に、最初にデータをバインドします

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
}

それから別のコンポーネントで

@Autowired
private AllowedHosts allowedHosts;

これで完了です!

5
JeanValjean

application.ymlでコンマ区切り値を使用します

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

アクセス用のJavaコード

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

私は試して成功しました;)

5

私は以下のようにプロパティからリストを読み取ることができました-

プロパティ-

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

プロパティを読み取ります

@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

私は同じ問題に出会いましたが、解決し、あなたに私の解決策を与えます

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

spring boot 2.1.6.RELEASEのバージョンで成功

0
sean teng