YML读取注意事项

使用YML时遇到的坑: 
最近在做项目时,遇到了一些在读取YML配置时发生的问题,在这里写一并写下来,希望给自己以及大家一个提示,能尽量避免在读取配置文件时发生这些错误,给开发带来不必要的多余时间去处理。

多重层级读取

在YML中我们再添加一个ZZP2的配置信息,其中包含了girl节点以及girl下的name,age属性。

zzp2:
name: 西科啦啦
age: 30
height: 175cm
weight: 760kg
long: 10cm
girl:
name: Marry.Jean
age: 18

和之前一样,我们controller中通过@Value注解来获取属性值,同时创建一个url来输出我们的属性值。

@Value("${zzp2.name}")
private String name2; @Value("${zzp2.girl.age}")
private Integer girlAge; @Value("${zzp2.girl.name}")
private String girlName; @RequestMapping(value = "/getZzpGirlInfo",method = RequestMethod.GET)
public String getZzpGirlInfo(){
return "zzp2.name:" + name2 + "\n" + "zzp2.girl.age:" + girlAge + "\n" + "zzp2.girl.name:" + girlName;
}

接下来我们通过POSTMAN来访问下,可以看到使用注解@Value没有问题,都可以渠道属性值。 

接下来我们按照之前的思路建立一个Zzp2properties来将配置文件转变为一个实体类进行接收,这个时候问题就来了,我们如何定义girl这个属性呢,我们之前说过,配置文件与实体类的映射是根据属性名一致来相互对应的,可是我们无法命名一个属性为girl.name啊。我想聪明的你应该已经想到了,是的,我们再建立一个实体类Girl来接收girl的参数,其中的属性也是与girl下的参数一一对应。

public class Girl {

    private String name;

    private String age;

  //get set 方法...
}
@Component
@ConfigurationProperties(value = "zzp2")
public class Zzp2Properties { private String name; private String height; private String weight; private Integer age; private Girl girl; @Override
public String toString() {
return "Zzp2Properties{" +
"name='" + name + '\'' +
", height='" + height + '\'' +
", weight='" + weight + '\'' +
", age=" + age +
", girl=" + girl +
'}';
}
//get set方法...

之后我们再在controller中测试一下

@Autowired
private Zzp2Properties zzp2Properties; @RequestMapping(value = "/getZzpGirlInfo2",method = RequestMethod.GET)
public Zzp2Properties getZzpGirlInfo2(){
return zzp2Properties;
}

可以发现,girl的参数已经被注入进来,可以正常获得了,这里要特别说明的是在ZzpProperties中的属性Girl命名一定是girl,必须要与配置文件中的保持一致。 

static静态属性

在一般开发中,我们经常会做静态属性或是静态块的方法来给我们的config使用,比如我使用jedis时,config中就是使用静态块来创建链接,那在YML中能否将配置信息读进static中呢?很可惜,答案是否定的。 
我们首先在application.yml中增加zzp3的配置信息。

zzp3:
name: 北坡卡卡
age: 10
height: 105cm
weight: 30kg

然后在controller中通过设置静态属性来获取配置信息。

@Value("${zzp3.name}")
private static String name3; @Value("${zzp3.age}")
private static Integer age3; @Value("${zzp3.height}")
private static String height3; @RequestMapping(value = "/getZzp3Info",method = RequestMethod.GET)
public String getZzp3Info(){
return "zzp3.name:" + name3 + "\n" + "zzp3.age:" + age3 + "\n" + "zzp3.name:" + name3;
}

通过POSTMAN的测试,我们发想,属性值都是null,无法得到配置文件参数。 

那是不是我们就无法使用static来获取配置信息来呢?其实并不然,我们可以使用static属性的set方法来获取,我们添加三个参数的set方法,并吧set方法中的static给去掉,同时吧直接@Value置于set方法上。

private static String name3;

private static Integer age3;

private static String height3;

@Value("${zzp3.name}")
public void setName3(String name3) {
Round2Controller.name3 = name3;
} @Value("${zzp3.age}")
public void setAge3(Integer age3) {
Round2Controller.age3 = age3;
} @Value("${zzp3.height}")
public void setHeight3(String height3) {
Round2Controller.height3 = height3;
}

我们仍旧通过POSTMAN来访问看下结果,我们发现已经可以获取到值了。 

开发环境切换

上次我们说到切换开发环境,但并没有演示,我们这次来试一下,创建application-dev.yml其中将zzp3的配置信息更换下,然后在application.yml中指定使用dev的参数给项目使用。

#application-dev.yml
zzp3:
name: 西莫纳纳
age: 99
height: 95cm
weight: 90kg
#application.yml
spring:
profiles:
active: dev

我们通过POSTMAN可以发现,zzp3的信息已经是使用的dev的参数了。 

SpringBoot配置文件YML 注意事项的更多相关文章

  1. SpringBoot学习笔记(八):SpringBoot启动端口+访问路、SpringBoot配置文件yml、SpringBoot多环境区分、SpringBoot打包发布

    SpringBoot启动端口+访问路径 配置文件: server.port=9090 server.context-path=/springboot 现在只能用http://127.0.0.1:909 ...

  2. SpringBoot 配置文件 YML/Profile

    1. 全局配置文件 application.properties application.yml 配置文件名是固定的; 配置文件存放在src/main/resources目录或者类路径/config下 ...

  3. SpringBoot配置文件yml ScannerException: while scanning an alias *

    在使用yml编写配置我呢见 management: endpoints: web: base-path: /actuator jmx: exposure: include: * 报了如下错误 解决方案 ...

  4. springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务

    springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...

  5. springboot配置文件之yml的语法学习

    springboot配置文件(.yml/.yaml.properties) YAML(YAML Ain't Markup Language) YAML A Markup Language:是一个标记语 ...

  6. 解决spring-boot配置文件使用加密方式保存敏感数据启动报错No decryption for FailsafeTextEncryptor. Did you configure the keystore correctly

    spring-boot配置文件使用加密方式保存敏感数据 application.yml spring: datasource: username: dbuser password: '{cipher} ...

  7. SpringBoot 配置文件存放位置及读取顺序

    SpringBoot配置文件可以使用yml格式和properties格式 分别的默认命名为:application.yml.application.properties 存放目录 SpringBoot ...

  8. [SpringBoot] - 配置文件的多种形式及JSR303数据校验

    Springboot配置文件: application.yml   application.properties(自带) yml的格式写起来稍微舒服一点 在application.properties ...

  9. 3springboot:springboot配置文件(配置文件、YAML、属性文件值注入<@Value、@ConfigurationProperties、@PropertySource,@ImportResource、@Bean>)

    1.配置文件: springboot默认使用一个全局配置文件 配置文件名是固定的   配置文件有两种(开头均是application,主要是文件的后缀): ->application.prope ...

随机推荐

  1. ng-model的用法

    参考: http://www.cnblogs.com/guanglin/p/5200097.html http://www.runoob.com/angularjs/ng-ng-cloak.html ...

  2. bzoj1833 数字计数

    Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文 ...

  3. mongo获取lbs数据

    进入mongo目录执行./mongo 命令 #切换数据库use coachloc db.runCommand({geoNear : "coachloc" ,near : [113. ...

  4. jQuery 的noConflict()的使用.

    我们项目现在需要用到两个js库.一个是jQuery库,还有一个是我们自己开发的轻量级的gys.js库. 而gys库对外提供的接口也是$符号.和jQuery库是一样的,这个时候,两个库就会发生冲突了,我 ...

  5. 【POJ】2480 Longge's problem(欧拉函数)

    题目 传送门:QWQ 分析 题意就是求∑gcd(i, N) 1<=i <=N.. 显然$ gcd(i,n) = x $时,必然$x|n$. 所以我们枚举一下n的约数,对于每个约数x,显然$ ...

  6. ESB的编程模型(场景)

    GateWay:网关channel:数据传输的通道adapter:数据连接通道的数据适配器spliter:对通道里面的数据进行分割router:对通道进行路由transforme:对消息进行格式化转化 ...

  7. express有中间件的增删改查

    var express = require('express');引入express框架 var router = express.Router();引入router路由级中间件 var data = ...

  8. 浅谈forword和sendRedirect

    最近项目中全部用ajax请求数据,导致在做登录过滤器时不能重定向,然后仔细翻了翻Forward和sendRedirect,以下内容收集自百度: 1. forward (服务器端作的重定向) 服务器往c ...

  9. Python3 引入sqlite3时出现错误:ModuleNotFoundError: No module named '_sqlite3'

    在Python3 中内置了SQLite3,但是在编译安装完之后执行: import sqlite3 出现错误: ModuleNotFoundError: No module named '_sqlit ...

  10. node使用MySQL数据库

    内容: 1.node连接数据库 2.数据库常用操作 3.数据库实例 - 用户注册.登陆 1.node连接数据库 (1)下载mysql模块 (2)使用mysql模块连接数据库 let db=mysql. ...