Предложение, не усложняйте.
Скажите, что вы хотите, чтобы этот список был Environment
переменной.Вы установили бы его с помощью
-Dtopics=topic-01,topic-02,topic-03
Затем вы можете восстановить его с помощью введенного Environment
Бина и создать новый List<String>
Бин
@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);
}