春のブート構成でのリストのための環境変数

フオンホアン:

私の春のブートアプリケーションのために、私はのリストを保持環境変数を使用しようとしていますproperties.topicsapplication.yml(下記の設定を参照します)。

properties:
      topics:
        - topic-01
        - topic-02
        - topic-03

私は(これを参照移入プロパティBeanに設定ファイルを使用し、スプリングのマニュアルを参照して以下に示すように、)

import java.util.ArrayList;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("properties")
public class ApplicationProperties {
  private List<String> topics = new ArrayList<>();
  public void setTopics(List<String> topics) {
     this.topics = topics;
  }
  public List<String> getTopics() {
     return this.topics;
  }
}

環境変数を使用すると、私は変更せずに、リストの内容の変更を持つことができますapplication.ymlしかし、私は唯一の環境変数は、私の場合には、値のないコレクションを単一の値のみを保持する場合のために、これまでに見つけることができることをすべての例。

編集:

それは@ vancleffさんのコメントの後に明らかにすることを、私は環境変数の値がに保存する必要はありませんapplication.yml

別の編集:

私は私の質問をoversimplifyingことで、私は足で自分自身を撮影すると思います。@LppEdd答えは私の質問に与えられた例でうまく動作します。代わりに、単純な文字列のトピック名の集まりで、私はもう少し複雑な構造を必要とする場合は、何が起こります。例えば、何かのように

properties:
  topics:
    - 
      name: topic-01
      id: id-1
    - 
      name: topic-02
      id: id-2
    - 
      name: topic-03
      id: id-3
LppEdd:

提案ではなく、overcomplicateありません。

あなたのようにそのリストをしたいと言うEnvironment変数。あなたは使用してそれを設定したいです

-Dtopics=topic-01,topic-02,topic-03

その後、注入された使用して、それを回復することができEnvironmentビーンを、そして新しい作成List<String>Beanの

@Bean
@Qualifier("topics")
List<String> topics(final Environment environment) {
    final var topics = environment.getProperty("topics", "");
    return Arrays.asList(topics.split(","));
}

今から、それがList可能@Autowired
また、多分、カスタム修飾子アノテーションを作成することを検討することができます@Topics

それから

@Service
class TopicService {
   @Topics
   @Autowired
   private List<String> topics;

   ...
}

あるいは

@Service
class TopicService {
   private final List<String> topics;

   TopicService(@Topics final List<String> topics) {
      this.topics = topics;
   }

   ...
}

あなたは何ができることは、外部化ファイルを使用しています。
環境パラメータに、そのファイルへのパスを渡します。

-DtopicsPath=C:/whatever/path/file.json

使用よりEnvironmentそのパスを回復するために豆を。ファイルの内容を読み、聞いてJackson、それをデシリアライズします

また、簡単な作成する必要があると思いますTopicクラスを

public class Topic {
    public String name;
    public String id;
}

どの本の要素を表すJSON配列を

[
    {
        "name": "topic-1",
        "id": "id-1"
    },
    {
        "name": "topic-2",
        "id": "id-2"
    }
]

@Bean
List<Topic> topics(
        final Environment environment,
        final ObjectMapper objectMapper) throws IOException {
    // Get the file path
    final var topicsPath = environment.getProperty("topicsPath");

    if (topicsPath == null) {
        return Collections.emptyList();
    }

    // Read the file content
    final var json = Files.readString(Paths.get(topicsPath));

    // Convert the JSON to Java objects
    final var topics = objectMapper.readValue(json, Topic[].class);
    return Arrays.asList(topics);
}

ここでは、画像の説明を入力します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=201437&siteId=1