1. 程式人生 > >SpringBoot 讀取yml檔案,以及獲取不到value的情況

SpringBoot 讀取yml檔案,以及獲取不到value的情況

如果出現value無法獲取的情況,請看一下pom專案是不是依賴不對,

一,spring元件重寫構造方法,在構造方法中引用@value為null

由於spring例項化順序為先執行構造方法,再注入成員變數,所以序為先執行構造方法,再注入成員變數,所以ing例項化順取值為null
解決辦法為:再寫一個常量類,在常量類中引用@value,再在構造方法中引用常量類的變數即可。

二,呼叫spring元件時使用new物件,而不是@Autowired

三,使用final或static修飾成員變數

四,spring mvc中引用@value為null

spring mvc是spring的子容器,需要在兩個配置檔案中都匯入配置檔案
<context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/>

在spring boot中,簡單幾步,讀取配置檔案(application.yml)中各種不同型別的屬性值:

1、引入依賴:

        <!-- 支援 @ConfigurationProperties 註解 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

2、配置檔案(application.yml)中配置各個屬性的值

myProps: #自定義的屬性和值

  simpleProp: simplePropValue

  arrayProps: 1,2,3,4,5

  listProp1:

    - name: abc

      value: abcValue

    - name: efg

      value: efgValue

  listProp2:

    - config2Value1

    - config2Vavlue2

  mapProps:

    key1: value1

    key2: value2


3、建立一個bean來接收配置資訊:

@Component
@ConfigurationProperties(prefix="myProps") //接收application.yml中的myProps下面的屬性
public class MyProps {
	private String simpleProp;
	private String[] arrayProps;
	private List<Map<String, String>> listProp1 = new ArrayList<>(); //接收prop1裡面的屬性值
	private List<String> listProp2 = new ArrayList<>(); //接收prop2裡面的屬性值
	private Map<String, String> mapProps = new HashMap<>(); //接收prop1裡面的屬性值
	
	public String getSimpleProp() {
		return simpleProp;
	}
	
	//String型別的一定需要setter來接收屬性值;maps, collections, 和 arrays 不需要
	public void setSimpleProp(String simpleProp) {
		this.simpleProp = simpleProp;
	}
	
	public List<Map<String, String>> getListProp1() {
		return listProp1;
	}
	public List<String> getListProp2() {
		return listProp2;
	}
 
	public String[] getArrayProps() {
		return arrayProps;
	}
 
	public void setArrayProps(String[] arrayProps) {
		this.arrayProps = arrayProps;
	}
 
	public Map<String, String> getMapProps() {
		return mapProps;
	}
 
	public void setMapProps(Map<String, String> mapProps) {
		this.mapProps = mapProps;
	}
}

啟動後,這個bean裡面的屬性就會自動接收配置的值了。
 

4、單元測試用例:

​
@Autowired
private MyProps myProps; 
	
@Test
public void propsTest() throws JsonProcessingException {
	System.out.println("simpleProp: " + myProps.getSimpleProp());
	System.out.println("arrayProps: " + objectMapper.writeValueAsString(myProps.getArrayProps()));
	System.out.println("listProp1: " + objectMapper.writeValueAsString(myProps.getListProp1()));
	System.out.println("listProp2: " + objectMapper.writeValueAsString(myProps.getListProp2()));
	System.out.println("mapProps: " + objectMapper.writeValueAsString(myProps.getMapProps()));
	}

​

測試結果:

simpleProp: simplePropValue
arrayProps: ["1","2","3","4","5"]
listProp1: [{"name":"abc","value":"abcValue"},{"name":"efg","value":"efgValue"}]
listProp2: ["config2Value1","config2Vavlue2"]
mapProps: {"key1":"value1","key2":"value2"}