私の春のブートアプリケーションのために、私はのリストを保持環境変数を使用しようとしていますproperties.topics
中application.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
提案ではなく、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);
}