springboot yml自定义属性

springboot yml自定义属性

1. 字符串

写法:

# 自定义参数
custom:
  value: 张三
  value1: "张三"
  • 获取方式1:

    使用@Value配合spel表达式进行赋值

    @Value("${custom.value}")
    private String value;
    @Value("${custom.value1}")
    private String value1;
    

    注意:${}中不能有空格

  • 获取方式2:

    这是通用的获取方式,具体参考文末

2. 数组&List

2.1 写法:

数组和集合的写法一样,只是接收是定义的类型不一致

2.1.1 写法1
custom:
  # arr1: "12","3","4" 错误写法:ParserException
  #元素之间以逗号分隔,可以用数字类型接收,注意数字类型的范围
  #底层是String的转换,convert java.lang.String to byte
  arr1: 1,2,3 
  arr2: "1,2,3" 

获取方式

// int[]接收
@Value("${custom.arr1}")
private int[] arr1;
// List<String>接收
@Value("${custom.arr2}")
private List<String> arr1;
2.1.2 写法2
custom:
  # 中括号包裹,以逗号分隔
  arr2: ["1,2", 3.6, 4/2]

**注意:**不能使用@Value方式读取值,只能使用通用方式读取值

2.1.3 写法3
custom:
  arr3:
    - "1,2"
    - "2"
    - "3"

**注意:**不能使用@Value方式读取值,只能使用通用方式读取值

3. 对象

custom:
  bean:
    #以下属性必须和对象的属性名(get方法)一致才能封装进去
    id: 20
    name: 张三

**注意:**不能使用@Value方式读取值,只能使用通用方式读取值

4. Map

custom:
  map:
    #键: 值
    a: mapa
    b: mapb
  map2: {a: map2a,b: map2b} #注意冒号后有个空格,逗号分隔

**注意:**不能使用@Value方式读取值,只能使用通用方式读取值

5. 嵌套数据

custom:
  # 集合存Map
  listmap1:
  - {a: map1a,b: map1b}
  - {a: map2a,b: map2b}
  listmap2:
  - a: a
    b: b
  - c: c
    d: d
  #map存list
  maplist:
    a:
    - lista1
    - lista2
    b: ["listb1","listb2"]
  #集合存对象
  listbean:
  - id: 20
    name: 张三
  - id: 20
    name: 张三
  #Map存对象
  mapbean:
    bean1:
      id: 20
      name: 张三
    bean2:
      id: 20
      name: 张三

**注意:**不能使用@Value方式读取值,只能使用通用方式读取值

** 通用方式 **

# 自定义参数
custom: #通用方式必须多一级
  value: 张三
  bean:
    id: 20
    name: 张三
  arr1: "-1280,3,4"
  arr2: [1, 3.6, 42]
  arr3:
    - "1,2"
    - "2"
    - "3"
  list1: "list1a,list1b"  #"list1a,list1b","list1a,list1b" 错误
  list2: ["list1,a","list1b"]
  list3:
  - list2a
  - list2b
  map:
    a: mapa
    b: mapb
  map2: {a: map2a,b: map2b}
  listmap1:
  - {a: map1a,b: map1b}
  - {a: map2a,b: map2b}
  listmap2:
  - a: a
    b: b
  - c: c
    d: d
  maplist:
    a:
    - lista1
    - lista2
    b: ["listb1","listb2"]

  listbean:
  - id: 20
    name: 张三
  - id: 20
    name: 张三
  mapbean:
    bean1:
      id: 20
      name: 张三
    bean2:
      id: 20
      name: 张三
package com.example;

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

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

@Component  //添加到spring容器中,方便使用@Autowired注入
@ConfigurationProperties(prefix = "custom")  //设置前缀,必须
public class YmlConfiguration {
	/**
     * 获取yml中的值
     * 注意:
     * 1、成员变量名称(实质是set方法)需要和配置的自定义参数名称一致
     * 2、每个成员变量必须要有 get/set方法
     * 3、封装bean对象时,需要bean中有yml中bean子属性的get/set方法
     * 4、该类必须使用注解ConfigurationProperties修饰
     */
    private String value;
    private User bean;
    private int[] arr1;
    private Integer[] arr2;
    private String[] arr3;
    private List<String> list1;
    private List<String> list2;
    private List<String> list3;
    private Map<String, String> map;
    private Map<String, String> map2;
    private List<Map<String, String>> listmap1;
    private List<Map<String, String>> listmap2;
    private Map maplist;
    private List<User> listbean;
    private Map<String,User> mapbean;

	//省略geter/seter方法
}

常见异常

异常信息片段:Reason: No setter found for property: XXX
异常原因:没有对应的setXXX方法
解决方法:检查set方法和自定义参数是否一致,或没设置set方法
异常信息片段:BeanCreationException: Error creating bean with name 'whiteConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'XXX' in value "${XXX}"
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'XXX' in value "${XXX}"

异常原因:

  • yml配置中没有XXX参数

    **解决方法:**检查yml参数和 V a l u e ( " Value(" Value("{XXX}")中的一致

  • 使用 V a l u e ( " Value(" Value("{XXX}")的方式读取yml自定义参数,当参数类型不支持这种方式获取,如读取bean对象

    **解决方法:**使用通用方式

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值