YAML a la lista de objetos en Spring Boot

1. Información general

En este breve tutorial, veremos más de cerca cómo mapear una lista YAML en una Lista en Spring Boot .

Primero comenzaremos con algunos antecedentes sobre cómo definir listas en YAML. A continuación, vamos a profundizar más para ver cómo enlazar listas YAML a lista de s de los objetos.

2. Resumen rápido sobre las listas en YAML

En resumen, YAML es un estándar de serialización de datos legible por humanos que proporciona una forma concisa y clara de escribir archivos de configuración. Lo bueno de YAML es el hecho de que admite varios tipos de datos, como List s, Map s y tipos escalares .

Los elementos de una lista YAML se definen mediante el carácter "-" y todos comparten el mismo nivel de sangría:

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

Como comparación, el equivalente basado en propiedades usa índices:

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

Para obtener más ejemplos, no dude en consultar nuestro artículo sobre cómo definir listas y mapas utilizando YAML y archivos de propiedades.

De hecho, la naturaleza jerárquica de YAML mejora significativamente la legibilidad en comparación con los archivos de propiedades . Otra característica interesante de YAML es la posibilidad de definir diferentes propiedades para diferentes perfiles de Spring.

Vale la pena mencionar que Spring Boot proporciona soporte listo para usar para la configuración YAML. Por diseño, Spring Boot carga las propiedades de configuración de application.yml al inicio sin ningún trabajo adicional.

3. Vinculación de una lista YAML a una lista simple de objetos

Spring Boot proporciona la anotación @ConfigurationProperties para simplificar la lógica de mapear datos de configuración externos en un modelo de objeto .

En esta sección, usaremos @ConfigurationProperties para vincular una lista YAML en una lista .

Comenzamos definiendo una lista simple en application.yml :

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

Luego, crearemos un POJO ApplicationProps simple para mantener la lógica de vincular nuestra lista YAML a una Lista deobjetos:

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

La clase ApplicationProps necesita estar decorada con @ConfigurationProperties para expresar la intención de mapear todas las propiedades YAML con el prefijo especificado a un objeto de ApplicationProps .

Para enlazar la lista de perfiles solo necesitamos definir un campo de tipo List y la anotación @ConfigurationProperties se encargará del resto.

Observe que registramos la clase ApplicationProps como un bean Spring normal usando @Component . Como resultado, podemos inyectarlo en otras clases de la misma manera que cualquier otro bean Spring.

Finalmente, inyectamos el bean ApplicationProps en una clase de prueba y verificamos si nuestra lista de perfiles YAML se inyecta correctamente como una Lista :

@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. Vinculación de listas YAML a listas complejas

Ahora, vamos a bucear más profundo y ver cómo inyectar listas anidadas en YAML complejo estructurado Lista s .

Primero, agreguemos algunas listas anidadas a 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

En este ejemplo, vamos a vincular la propiedad props a List . De manera similar, asignaremos usuarios a una Lista de objetos de usuario .

Dado que cada elemento de la utilería de entrada tiene diferentes teclas, entonces podemos inyectar como una lista de Mapa s . Asegúrese de consultar nuestro artículo sobre cómo inyectar un mapa desde un archivo YAML en Spring Boot .

Sin embargo , en el caso de los usuarios , todos los elementos comparten las mismas claves, por lo que para simplificar su mapeo, es posible que necesitemos crear una clase de usuario dedicada para encapsular las claves como campos:

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 } }

Ahora verificamos que nuestras listas YAML anidadas estén correctamente mapeadas:

@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. Conclusión

En este tutorial, hemos aprendido cómo asignar listas YAML en Java Lista s. También verificamos cómo vincular listas complejas a POJO personalizados.

Como siempre, el código fuente completo de este artículo está disponible en GitHub.