Spring Загрузка: список чтения из yaml с помощью @Value или @ConfigurationProperties
Я хочу прочитать список хостов из файла yaml (application.yml), файл выглядит так:
cors:
hosts:
allow:
- http://foo1/
- http://foo2/
- http://foo3/
(пример 1)
Мой используемый класс определяет значение следующим образом:
@Value("${cors.hosts.allow}")
List<String> allowedHosts;
Но чтение не удается, так как Spring жалуется на это:
java.lang.IllegalArgumentException: не удалось разрешить заполнитель 'cors.hosts.allow' в строковом значении "$ {cors.hosts.allow}"
Когда я изменяю файл следующим образом, свойство может быть прочитано, но, естественно, оно не содержит список, а содержит только одну запись:
cors:
hosts:
allow: http://foo1, http://foo2, http://foo3
(я знаю, что могу прочитать значения одной строкой и разделить их на ","
, но пока не хочу искать обходной путь)
Это также не работает (хотя я думаю, что это должно быть действительно в соответствии с документами snakeyamls):
cors:
hosts:
allow: !!seq [ "http://foo1", "http://foo2" ]
(Пропуск !!seq
и простое использование [
/]
тоже провал)
Я прочитал предложение здесь, которое включает использование @ConfigurationProperties
, перенес пример в Java и использовал его с файлом yaml, который вы видите в Example1:
@Configuration
@EnableWebMvc
@ConfigurationProperties(prefix = "cors.hosts")
public class CorsConfiguration extends WebMvcConfigurerAdapter {
@NotNull
public List<String> allow;
...
Когда я запускаю это, я получаю эту жалобу:
org.springframework.validation.BindException: org.springframework.boot.bind.RelaxedDataBinder $ RelaxedBeanPropertyBindingResult: 1 ошибка Ошибка поля в объекте 'cors.hosts' в поле 'allow': отклонено значение [ноль]; коды [NotNull.cors.hosts.allow, NotNull.allow, NotNull]; аргументы [Org.springframework.context.support.DefaultMessageSourceResolvable: коды [cors.hosts.allow, разрешить]; аргумент тс []; сообщение по умолчанию [Разрешить]];
Я искал другие способы настройки хостов CORS и обнаружил эту проблему с Spring Boot, но так как она еще не закончена, я не могу использовать ее в качестве решения.
Все это делается с помощью Spring Boot 1.3 RC1
Ответы
Ответ 1
Это просто, ответ есть в этом документе, а также в этом
Итак, у вас есть такой вид:
cors:
hosts:
allow:
- http://foo1/
- http://foo2/
- http://foo3/
Затем вы сначала связываете данные
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ConfigurationProperties(prefix="cors.hosts")
public class AllowedHosts {
private List<String> HostNames; //You can also bind more type-safe objects
}
Затем в другом компоненте вы просто делаете
@Autowired
private AllowedHosts allowedHosts;
И все готово!
Ответ 2
используйте значения, разделенные запятыми, в application.yml
corsHostsAllow: http://foo1/, http://foo2/, http://foo3/
java-код для доступа
@Value("${corsHostsAllow}")
String[] corsHostsAllow
Я пробовал и добился успеха;)
Ответ 3
Мне удалось прочитать список из таких свойств, как ниже -
Свойства -
cors.hosts.allow[0]=host-0
cors.hosts.allow[1]=host-1
Считать свойство -
@ConfigurationProperties("cors.hosts")
public class ReadProperties {
private List<String> allow;
public List<String> getAllow() {
return allow;
}
public void setAllow(List<String> allow) {
this.allow = allow;
}
}
Ответ 4
Я встретил ту же проблему, но решил, дать вам мое решение
exclude-url: >
/management/logout,
/management/user/login,
/partner/logout,
/partner/user/login
успех в версии Spring boot 2.1.6.RELEASE