YAML към списък на обектите в Spring Boot

1. Общ преглед

В този кратък урок ще разгледаме по-отблизо как да картографираме списък на YAML в списък в Spring Boot .

Първо ще започнем с малко предистория за това как да дефинираме списъци в YAML. След това ще копаят по-дълбоко, за да видите как да се обвърже YAML списъци, за да Списък ите на обектите.

2. Бързо обобщение на списъците в YAML

Накратко, YAML е разбираем за хората стандарт за сериализация на данни, който предоставя кратък и ясен начин за писане на конфигурационни файлове. Хубавото на YAML е фактът, че той поддържа множество типове данни като списъци , карти и скаларни типове .

Елементите в списък YAML се дефинират с помощта на символа „-“ и всички те споделят едно и също ниво на отстъп:

yamlconfig: list: - item1 - item2 - item3 - item4

Като сравнение, базиран на свойства еквивалент използва индекси:

yamlconfig.list[0]=item1 yamlconfig.list[1]=item2 yamlconfig.list[2]=item3 yamlconfig.list[3]=item4

За повече примери, не се колебайте да разгледате нашата статия за това как да дефинирате списъци и карти, използвайки YAML и файлове със свойства.

Всъщност йерархичният характер на YAML значително подобрява четливостта в сравнение с файловете със свойства . Друга интересна характеристика на YAML е възможността за дефиниране на различни свойства за различни профили на Spring.

Струва си да се спомене, че Spring Boot осигурява изчерпателна поддръжка за YAML конфигурация. По дизайн Spring Boot зарежда свойствата на конфигурацията от application.yml при стартиране без допълнителна работа.

3. Обвързване на YAML списък с прост списък с обекти

Spring Boot предоставя анотацията @ConfigurationProperties, за да опрости логиката на картографиране на външни данни за конфигурация в обектен модел .

В този раздел ще използваме @ConfigurationProperties, за да обвържем YAML списък в списък .

Започваме с дефиниране на прост списък в application.yml :

application: profiles: - dev - test - prod - 1 - 2

След това ще създадем прост POJO на ApplicationProps, който да задържи логиката на свързване на нашия списък YAML със списък наобекти:

@Component @ConfigurationProperties(prefix = "application") public class ApplicationProps { private List profiles; // getter and setter }

Класът ApplicationProps трябва да бъде украсен с @ConfigurationProperties, за да изрази намерението за картографиране на всички свойства на YAML с посочения префикс към обект на ApplicationProps .

За да обвържем списъка с профили , просто трябва да дефинираме поле от тип List, а анотацията @ConfigurationProperties ще се погрижи за останалото.

Забележете, че регистрираме класа ApplicationProps като нормален Spring bean с помощта на @Component . В резултат на това можем да го инжектираме в други класове по същия начин, както всеки друг пролетен боб.

И накрая, инжектираме зърното ApplicationProps в тестов клас и проверяваме дали списъкът на YAML на нашите профили е правилно инжектиран като Списък :

@ExtendWith(SpringExtension.class) @ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) @EnableConfigurationProperties(value = ApplicationProps.class) class YamlSimpleListUnitTest { @Autowired private ApplicationProps applicationProps; @Test public void whenYamlList_thenLoadSimpleList() { assertThat(applicationProps.getProfiles().get(0)).isEqualTo("dev"); assertThat(applicationProps.getProfiles().get(4).getClass()).isEqualTo(Integer.class); assertThat(applicationProps.getProfiles().size()).isEqualTo(5); } }

4. Обвързване на YAML списъци със сложни списъци

Сега, нека да се потопите дълбоко и да видим как да се инжектира вложени YAML списъци в комплекс структурирана Списък ите .

Първо, нека добавим вложени списъци към application.yml :

application: // ... props: - name: YamlList url: //yamllist.dev description: Mapping list in Yaml to list of objects in Spring Boot - ip: 10.10.10.10 port: 8091 - email: [email protected] contact: //yamllist.dev/contact users: - username: admin password: [email protected]@ roles: - READ - WRITE - VIEW - DELETE - username: guest password: [email protected] roles: - VIEW

В този пример ще свържем свойството props със списък . По същия начин ще картографираме потребителите в Списък на потребителски обекти.

Тъй като всеки елемент от подпори влизането притежава различни ключове, тогава можем да го инжектират като Списък на карта ите . Не забравяйте да разгледате нашата статия за това как да инжектирате карта от YAML файл в Spring Boot .

Въпреки това , в случай на потребителите , всички елементи споделят едни и същи клавиши, така че да се опрости нейното картографиране, може да се наложи да се създаде специален Потребителят клас за капсулиране на ключовете като области:

public class ApplicationProps { // ... private List props; private List users; // getters and setters public static class User { private String username; private String password; private List roles; // getters and setters } }

Сега проверяваме дали нашите вложени YAML списъци са правилно картографирани:

@ExtendWith(SpringExtension.class) @ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) @EnableConfigurationProperties(value = ApplicationProps.class) class YamlComplexListsUnitTest { @Autowired private ApplicationProps applicationProps; @Test public void whenYamlNestedLists_thenLoadComplexLists() { assertThat(applicationProps.getUsers().get(0).getPassword()).isEqualTo("[email protected]@"); assertThat(applicationProps.getProps().get(0).get("name")).isEqualTo("YamlList"); assertThat(applicationProps.getProps().get(1).get("port").getClass()).isEqualTo(Integer.class); } }

5. Заключение

В този урок научихме как да картографираме YAML списъците в Java List s. Също така проверихме как да свързваме сложни списъци с потребителски POJO.

Както винаги, пълният изходен код за тази статия е достъпен в GitHub.