前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >yaml配置文件转换为POJO

yaml配置文件转换为POJO

作者头像
十毛
发布2021-01-18 10:19:58
9480
发布2021-01-18 10:19:58
举报
文章被收录于专栏:用户1337634的专栏

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

引入依赖

  • pom.xml
代码语言:javascript
复制
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.12.1</version>
</dependency>

配置类

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

配置解析

代码语言:javascript
复制
/**
 * 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

代码语言:javascript
复制
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

运行

输出日志:

代码语言:javascript
复制
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)])

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引入依赖
  • 配置类
  • 配置解析
  • 配置文件application.yml
  • 运行
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档