yaml配置文件转换为POJO

yaml作为配置文件使用起来比properties更加友好,一方面结构化特性好,而且方便表达复杂的数据结构,比如数组。Spring Boot对yaml的支持也非常好。但是如果没有Spring Boot,如何方便的读取的yaml配置文件呢? 本文介绍一种仿照Spring Boot的,把yaml快速转变为配置类的方法。

引入依赖

  • pom.xml
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.12.1</version>
</dependency>

配置类

  • 配置信息一:MessageQueueProperties
@Data
public class MessageQueueProperties {
    private String master;
    private List<String> topicNames;
    private String consumerGroup;
}
  • 配置信息二:DatabaseProperties
@Data
public class DatabaseProperties {
    private String dbName;
    private String jdbcUrl;
    private String driverClassName;
    private String username;
    private String password;
}
  • 总体应用配置信息:ApplicationProperties
/**
 * 应用的配置信息.
 *
 * @author tenmao
 */
@Slf4j
@Data
public class ApplicationProperties {
    private MessageQueueProperties mq;
    private List<DatabaseProperties> databases;
}

配置解析

/**
 * yaml转变成POJO.
 * 仿照Spring Boot的模式,配置文件的优先级如下{{PWD}}/config/application.yml, {{PWD}}/application.yml, {{CLASS_PATH}}/application.yml
 *
 * @author tenmao
 */
@Slf4j
public class TenYamlMain {
    private static final String PROPERTIES_NAME = "application.yml";

    public static void main(String[] args) throws IOException {
        Optional<String> configOpt = getFromConfigDir();
        if (!configOpt.isPresent()) {
            configOpt = getFromPwd();
        }
        if (!configOpt.isPresent()) {
            configOpt = getFromClassPath();
        }
        if (!configOpt.isPresent()) {
            throw new IllegalArgumentException("配置文件不存在");
        }

        //yaml格式配置文件转成配置POJO
        ObjectMapper om = new ObjectMapper(new YAMLFactory());

        ApplicationProperties applicationProperties = om.readValue(configOpt.get(), ApplicationProperties.class);

        log.info("application properties: {}", applicationProperties);
    }


    private static Optional<String> getFromConfigDir() throws IOException {
        try (FileInputStream fis = new FileInputStream("com/tenmao/config/" + PROPERTIES_NAME)) {
            return Optional.of(CharStreams.toString(new InputStreamReader(fis, StandardCharsets.UTF_8)));
        } catch (FileNotFoundException e) {
            return Optional.empty();
        }
    }

    private static Optional<String> getFromPwd() throws IOException {
        try (FileInputStream fis = new FileInputStream(PROPERTIES_NAME)) {
            return Optional.of(CharStreams.toString(new InputStreamReader(fis, StandardCharsets.UTF_8)));
        } catch (FileNotFoundException e) {
            return Optional.empty();
        }
    }

    private static Optional<String> getFromClassPath() throws IOException {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

        try (InputStream is = classLoader.getResourceAsStream(PROPERTIES_NAME)) {
            if (is == null) {
                return Optional.empty();
            }
            return Optional.of(CharStreams.toString(new InputStreamReader(is, StandardCharsets.UTF_8)));
        }
    }
}

配置文件application.yml

mq:
  topicNames:
    - topic1
    - topic2
  consumerGroup: consumer_group_1
  master: pulsar://192.168.0.100:6650,192.168.0.101:6650,192.168.0.102:6650
databases:
  -
    dbName: default
    driverClassName: org.postgresql.Driver
    jdbcUrl: jdbc:postgresql://localhost:5433/tenmao
    username: tenmao
    password: tenmao

运行

输出日志:

21:38:23.831 [main] INFO com.tenmao.TenYamlMain - application properties: ApplicationProperties(mq=MessageQueueProperties(master=pulsar://192.168.0.100:6650,192.168.0.101:6650,192.168.0.102:6650, topicNames=[topic1, topic2], consumerGroup=consumer_group_1), databases=[DatabaseProperties(dbName=default, jdbcUrl=jdbc:postgresql://localhost:5433/tenmao, driverClassName=org.postgresql.Driver, username=tenmao, password=tenmao)])

参考

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容