当bean构造函数使用参数时,Spring初始化失败

时间:2019-01-10 00:09:06

标签: java spring spring-boot constructor

SpringBoot应用程序尝试初始化此类时失败:

@Component
public class Weather {

private Map<Integer,Double> maxRainyDays;
private Map<Integer,  WeatherDays> totalDays;

public Weather(Map<Integer, WeatherDays> totalDays, Map<Integer,Double> maxRainyDays){

    this.setMaxRainyDays(maxRainyDays);
    this.setTotalDays(totalDays);

}

错误:

  

SolarSystem.Models.Weather构造函数的参数0需要一个   类型为“ SolarSystem.Utilities.WeatherDays”的bean,不能为   找到。

提到的bean已经定义(在相同的基本包中):

public enum WeatherDays {

RAINY,
MILD,
DRY,
MAX_RAIN}

解决方法:

当我使用Weather()构造函数时,我解决了这个问题。当然,我必须使用setter来设置对象的属性。

但是我需要了解发生这种情况的原因

1 个答案:

答案 0 :(得分:1)

因为您通过构造函数参数注入的集合(在此处映射)未注册为Spring Bean。这就是为什么要用@service@repository等注释类,然后将它们自动连接到其他类的原因。要解决此问题,您可以设置类似以下的配置类:

@Configuration
public class BeanConfig {

    @Bean
    public Map<Integer, WeatherDays> totalDays() {
        Map<Integer, WeatherDays> map = new HashMap<>();
        map.put(1, WeatherDays.DRY);
        return map;
    }

    @Bean
    public Map<Integer, Double> maxRainyDays() {
        Map<Integer, Double> map = new HashMap<>();
        map.put(1, 0.2);
        return map;
    }
}