SpringBoot配置報錯之java.lang.IllegalStateException


package com.sjl.domain;

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

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

/**
 * 建一個Person類模型,里面封裝6個屬性及其get、set、toString方法
 * */
@Component//將該組件注入到Spring容器中
@ConfigurationProperties(prefix = "person")
//相當於是將配置文件中所有以person開頭的值注入到當前類中。   注意:在pom里要添加processor包
public class Person {
    //...
}
package com.test;

import com.springboot.app.SpringbootexerciseApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.sjl.domain.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootexerciseApplication.class)
public class test {
    @Autowired
    private Person person;

    @Test
    public void contextLoads() {
        System.out.println("person="+person);
    }
}
package com.springboot.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages = "com.sjl.*") public class SpringbootexerciseApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootexerciseApplication.class, args);
    }

}

運行contextLoads報錯,錯誤現象如下:

看到這個報錯后,按照提示進行修改,在網上看了一下有幾種解決方案。

在測試類添加如下配置,即加上@SpringBootTest(classes=SpringbootexcrciseApplication.class)這個等價於Spring里面的上下文環境ApplicationContext,並在這里面加載整個工程文件

 但是加載后,顯示注入值的依賴出現了問題,於是將@Autowired private Person person;中@Autowired 於是把改為@Autowired(required=false),不強制注入值,結果可以了,但是注入的值為null,於是有百思不得其解,因為已經加了@Component注解了為什么還沒有注入到容器中去,分析了@SpringBootApplication源碼后,

 發現該注解只是掃描當前包路徑,所以,現在有兩種做法:

方法一:將測試類移到注入類這個包下。

方法二:配置啟動類的掃描路徑。(如SpringbootexerciseApplication類的加粗部分

說明:先看錯誤日志,錯誤日志為首要參考標准,網上去查是第二步,因為網上的說法太多了,情況也不一樣。

 

-------------------------------------------------------------------------------------------------------------------------------

分析@SpringBootApplication這個注解,一般是放到啟動類上面,作用有如下三個:

1)@SpringBootConfiguration標明該類為配置類。

2) @EnableAutoConfiguration啟動自動配置功能。

3)@ComponentScan包掃描器,默認掃描啟動類的當前包路徑,可以設置(scanBasePackages = "xxx.xxx.*"),指定掃描包路徑時,注意包路徑是否掃描正確,如com.controller.*和com.controller是有區別的,后者是掃描controller包下的所有,而前者是在后者基礎上再加了一個路徑相當於多了一個"/",所以,當有掃描配置,且把一個類進行了標注,但是仍然沒有被注入到Spring容器中,就要檢查路徑是否有問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM