9

次のように、解決できないプレースホルダーを含むアプリケーション構成が与えられた場合application.yml

my:
  thing: ${missing-placeholder}/whatever

注釈を使用する@Valueと、構成ファイルのプレースホルダーが検証されるため、この場合は次のようになります。

package com.test;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class PropValues {
    @Value("${my.thing}") String thing;
    public String getThing() { return thing; }
}

を取得しIllegalArgumentException: Could not resolve placeholder 'missing-placeholder' in value "${missing-placeholder}/whatever"ます。これは、値が によって直接設定されてAbstractBeanFactory.resolveEmbeddedValueおり、によってスローされた例外をキャッチするものが何もないためです。PropertyPlaceholderHelper.parseStringValue

ただし、スタイルに移行しようとすると@ConfigurationProperties、この検証が欠落していることに気付きました。たとえば、次の場合です。

package com.test;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;

@ConfigurationProperties(prefix = "my")
public class Props {
    private String thing;
    public String getThing() { return thing; }    
    public void setThing(String thing) { this.thing = thing; }
}

例外はありません。PropertySourcesPropertyValues.getEnumerablePropertyコメントで例外をキャッチし// Probably could not resolve placeholders, ignore it here、無効な値を内部マップに収集することがわかります。以降のデータ バインディングでは、未解決のプレースホルダーはチェックされません。

@Validatedクラスとフィールドにとアノテーションを適用するだけで@Validは役に立たないことを確認しました。

ConfigurationPropertiesバインドされた未解決のプレースホルダーで例外をスローする動作を保持する方法はありますか?

4

3 に答える 3

0

@Pattern注釈で渡す正しい正規表現は次のとおりです。^(?!\\$\\{).+

@Validated
@ConfigurationProperties("my.config")
public class ConfigProperties {
    
    @Pattern(regexp = "^(?!\\$\\{).+", message = "unresolved placeholder")
    private String uri;
    // ...
}
于 2021-05-11T07:02:53.120 に答える