web-dev-qa-db-ja.com

SpringBootでのYAMLリストのオブジェクトリストへのマッピング

YamlのリストをSpring Bootのオブジェクトのリストにマッピングする で説明されているのと同様の問題がありますが、オブジェクトの少なくとも1つのフィールドの識別子を対応するキー名と変更したい点が異なりますYAMLで使用されます。

例えば:

YAMLファイル:

config:
    gateways:
        -
            id: 'g0'
            nbrInputs: 128
            nbrOutputs: 128
        -
            id: 'g1'
            nbrInputs: 128
            nbrOutputs: 128

構成クラス:

@Configuration
@ConfigurationProperties(prefix="config")
public class GatewayConfig
{
    List<Gateway> gateways = new ArrayList<Gateway>();

    // Getter/Setter for gateways
    // ...

    public static class Gateway
    {
        private String id;

        @Value("${nbrInputs}")
        private int numInputs;

        @Value("${nbrOutputs}")
        private int numOutputs;

        // Getters and Setters
        // ...
    }
}

@Valueアノテーションで対応するプロパティ値を挿入できることを期待していましたが、これは機能していないようです( 'id'フィールドの挿入は問題なく機能しているようです)。

@Value(または他のアノテーション)でこれを行う方法はありますか?

ありがとうございました。


編集:YAMLプロパティと内部POJOのフィールドの間の対応を強制できるかどうかを判断しようとしていることに注意してくださいどちらの名前も変更せずに。私がこれをしたいと思うかもしれないいくつかの理由があります-例えば。 YAMLファイルの形式を制御できない可能性があり、YAMLファイルの作成者が使用したものよりもわかりやすい識別子名をPOJOで使用したいと思います。

6

Stephave Nicollが述べたように、@Valueアノテーションは@ConfigurationPropertiesとは何の関係もありません。構成ファイルと同じように内部POJOのフィールドに名前を付けるだけで、これは機能するはずです。

@Configuration
@ConfigurationProperties(prefix="config")
@EnableConfigurationProperties
public class GatewayConfig
{
    List<Gateway> gateways = new ArrayList<Gateway>();

    // Getter/Setter for gateways
    // ...

    public static class Gateway
    {
        private String id;
        private int nbrInputs;
        private int nbrOutputs;

        // Getters and Setters
        // ...
    }
}

コメントに対する反応:

プレーンなSpring/Spring Bootでは、異なる名前のフィールドをマップしてゲートウェイのリストにロードすることはできないと思います。プレーンな@Valueアノテーションを使用するオプションがありますが、ゲートウェイ数をハードコーディングする必要があります。

@Component
public class Gateway0{
    @Value("${config.gateways[0].id}")
    private String id;

    @Value("${config.gateways[0].nbrInputs}")
    private int numInputs;

    @Value("${config.gateways[0].nbrOutputs}")
    private int numOutputs;

    // Getters and Setters
    // ...
}
9
luboskrnac