DEV Community

Full Stack Hacker
Full Stack Hacker

Posted on

Spring Boot YAML example

In short, create a application.yml in the src/resources folder, Spring Boot will load and parse .yml file automatically and bind the values into the classes which annotated with @ConfigurationProperties. @ConfigurationProperties annotation allows to access properties set in configuration files (application.properties or application.yml) automatically and powerfully.

YAML and Properties

  • application.yml
logging:
  level:
    org.springframework: ERROR
    com.example: DEBUG

spring:
  profiles:
    active: dev
  main:
    banner-mode: off

email: haunt.hcm2015@gmail.com
thread-pool: 10

wordpress:
  menus:
    - title: Home
      name: Home
      path: /
    - title: About
      name: About
      path: /about
  themes:
    default-folder: /wp-content/themes/toptech
  servers:
    - ip: 127.0.0.1
      path: /dev1
    - ip: 127.0.0.2
      path: /dev2
    - ip: 127.0.0.3
      path: /dev3
Enter fullscreen mode Exit fullscreen mode
  • application.properties
# Spring Boot
logging.level.org.springframework=ERROR
logging.level.com.mkyong=DEBUG
spring.profiles.active=dev
spring.main.banner-mode=off

# Global
email=haunt.hcm2015@gmail.com
thread-pool=10

# WordPress
wordpress.menus[0].title=Home
wordpress.menus[0].name=Home
wordpress.menus[0].path=/
wordpress.menus[1].title=About
wordpress.menus[1].name=About
wordpress.menus[1].path=/about
wordpress.themes.default-folder=/wp-content/themes/toptech
wordpress.servers[0].ip=127.0.0.1
wordpress.servers[0].path=/dev1
wordpress.servers[1].ip=127.0.0.2
wordpress.servers[1].path=/dev2
wordpress.servers[2].ip=127.0.0.3
wordpress.servers[2].path=/dev3
Enter fullscreen mode Exit fullscreen mode

Project Structure

Project Dependency

Spring Boot uses SnakeYAML library to parse the YAML file, and the SnakeYAML library is provided by spring-boot-starter

The library and dependencies are configured in the pom.xml file

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-boot-yaml-example</artifactId>
    <packaging>jar</packaging>
    <name>Spring Boot YAML Example</name>
    <url>https://www.mkyong.com</url>
    <version>1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
            </plugin>

        </plugins>
    </build>
</project>
Enter fullscreen mode Exit fullscreen mode

Spring Boot + YAML

Spring Boot will load and parse the YAML file and bind the values in the following @ConfigurationProperties classes.

  • Menu.java
package com.example.yaml.config.model;

public class Menu {
    private String name;
    private String path;
    private String title;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Menu{" +
                "name='" + name + '\'' +
                ", path='" + path + '\'' +
                ", title='" + title + '\'' +
                '}';
    }
}
Enter fullscreen mode Exit fullscreen mode
  • Server.java
package com.example.yaml.config.model;

public class Server {
    private String ip;
    private String path;
    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    @Override
    public String toString() {
        return "Server{" +
                "ip='" + ip + '\'' +
                ", path='" + path + '\'' +
                '}';
    }
}
Enter fullscreen mode Exit fullscreen mode
  • Theme.java
package com.example.yaml.config.model;

public class Theme {
    private String defaultFolder;
    public String getDefaultFolder() {
        return defaultFolder;
    }

    public void setDefaultFolder(String defaultFolder) {
        this.defaultFolder = defaultFolder;
    }

    @Override
    public String toString() {
        return "Theme{" +
                "defaultFolder='" + defaultFolder + '\'' +
                '}';
    }
}
Enter fullscreen mode Exit fullscreen mode
  • GlobalProperties.java
package com.example.yaml.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties
public class GlobalProperties {
    private int threadPool;
    private String email;
    public int getThreadPool() {
        return threadPool;
    }

    public void setThreadPool(int threadPool) {
        this.threadPool = threadPool;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "GlobalProperties{" +
                "threadPool=" + threadPool +
                ", email='" + email + '\'' +
                '}';
    }
}
Enter fullscreen mode Exit fullscreen mode

The setter (and getter) names must correspond to the property names in the application.properties (or application.yml)

  • WordPressProperties.java
package com.example.yaml.config;

import com.example.yaml.config.model.Menu;
import com.example.yaml.config.model.Server;
import com.example.yaml.config.model.Theme;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
@ConfigurationProperties("wordpress")
public class WordPressProperties {

    private List<Menu> menus = new ArrayList<>();
    private Theme themes;
    private List<Server> servers = new ArrayList<>();
    public List<Menu> getMenus() {
        return menus;
    }

    public void setMenus(List<Menu> menus) {
        this.menus = menus;
    }

    public Theme getThemes() {
        return themes;
    }

    public void setThemes(Theme themes) {
        this.themes = themes;
    }

    public List<Server> getServers() {
        return servers;
    }

    public void setServers(List<Server> servers) {
        this.servers = servers;
    }

    @Override
    public String toString() {
        return "WordpressProperties{" +
                "menus=" + menus +
                ", themes=" + themes +
                ", servers=" + servers +
                '}';
    }
}

Enter fullscreen mode Exit fullscreen mode

Spring will automatically look for properties placed inside application.properties or application.yml prefixed with wordpress and inject them into the corresponding properties in the WordPressProperties class.

Start a Spring Boot normally and print out the values.

DEMO


Source code

https://github.com/java-cake/spring-boot/tree/main/yaml

Top comments (0)