zoukankan      html  css  js  c++  java
  • 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容器中,就要检查路径是否有问题。

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    1265 四点共面
    1298 圆与三角形
    1264 线段相交
    1185 威佐夫游戏 V2
    1183 编辑距离
    1089 最长回文子串
    HTML5 boilerplate 笔记(转)
    Grunt上手指南(转)
    RequireJS 2.0初探
    RequireJS学习笔记
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/12247873.html
Copyright © 2011-2022 走看看