Spring boot 读取YAML 到配置类
前言
一直对yaml 语法不是很熟悉,恰巧这次抽空熟练一下,结合配置类做个映射。含日期的处理 date,dateTime, localDate, localDateTime。需要注意日期格式的映射,还有就是Key 大小写的问题。
Java 配置类
package com.zlv11.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author lvzb
* @date 2022/11/15 14:09
**/
@Component
@Data
@ConfigurationProperties(prefix = CommonConfig.prefix)
public class CommonConfig {
public static final String prefix = "common-config";
private String name;
private Integer age;
private Date birthday;
private Date birthdayTime;
private LocalDate birthdayLocalDate;
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime birthdayLocalDateTime;
private List<String> brothers;
private List<Person> brothersList;
private Map<String, String> othersObj;
@Data
public static class Person implements Serializable {
private String name;
private Integer age;
private String hobby;
}
}
yaml 配置
yaml 配置里 映射 java Date 默认格式只能是 yyyy/MM/dd, 网上有些帖子说 yyyy-MM-dd能行,亲测会报错。对于 yaml 到 Java 的 LocalDateTime 映射,我这里取巧使用了 注解
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
才成功,其它方式都是会报错,如有知道具体默认格式,还请留言告知。
## 测试yaml读取
common-config:
name: zlv11
age: 25
#日期必须使用yyyy/MM/dd, yyyy-MM-dd,yyyyMMdd都会报错
birthday: 1999/06/21
birthdayTime: 1999/06/21 01:01:01
#LocalDate必须使用yyyy/MM/dd, 加了时分秒都会报错
birthdayLocalDate: 1999/06/21
birthdayLocalDateTime: 1999-06-21 11:49:31
# birthdayLocalDateTime: 1999-06-21 11:49:31 #错误
# birthdayLocalDateTime: 1999/06/21T11:49:31 #错误
othersObj:
k1: aa
k2: bb
k3: cc
k4: 789456
k5:
k5k6: 1999/00/00
brothers:
- jjin8
- zlv11
- zhihao1
- ygr1
brothersList:
-
name: jjin8
age: 31
-
name: zlv11
age: 24
-
name: zhihao1
age: 12
测试执行结果
package com.zlv11.properties;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @author lvzb
* @date 2022/11/15 14:09
**/
@Slf4j
@SpringBootTest
class CommonConfigTest {
@Autowired
private CommonConfig commonConfig;
@Test
void toStringTest() {
log.warn(">>>>> commonConfig :: {}", commonConfig);
}
}
控制台将会输出:
2022-11-15 15:10:31.352 WARN 33036 --- [ main] com.zlv11.properties.CommonConfigTest : >>>>> commonConfig :: CommonConfig(name=zlv11, age=25, birthday=Mon Jun 21 00:00:00 CST 1999, birthdayTime=Mon Jun 21 01:01:01 CST 1999, birthdayLocalDate=1999-06-21, birthdayLocalDateTime=1999-06-21T11:49:31, brothers=[jjin8, zlv11, zhihao1, ygr1], brothersList=[CommonConfig.Person(name=jjin8, age=31, hobby=null), CommonConfig.Person(name=zlv11, age=24, hobby=null), CommonConfig.Person(name=zhihao1, age=12, hobby=null)], othersObj={k1=aa, k2=bb, k3=cc, k4=789456, k5.k5k6=1999/00/00})