无法自动装配 ConfigurationProperties 类

问题描述 投票:0回答:1

我无法自动装配配置属性类。实例始终为空。

我关注了这篇文章:https://www.baeldung.com/configuration-properties-in-spring-boot#1-spring-boot-22

Spring boot 版本为 3.1.4

这是我的配置属性类。如果我在设置器内调试并设置断点。我可以看到它们被调用并按预期获取数据并将它们设置到类字段中。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;

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

@ConfigurationProperties("path.in.config")
public class MdcConfig {

    private List<String> allowedItems;
    private Map<String, String> replacementItems;

    public List<String> getAllowedItems() {
        return allowedItems;
    }

    public void setAllowedItems(List<String> allowedItems) {
        this.allowedItems = allowedItems;
    }

    public Map<String, String> getReplacementItems() {
        return replacementItems;
    }

    public void setReplacementItems(Map<String, String> replacementItems) {
        this.replacementItems = replacementItems;
    }
}

这里是主要应用:

@SpringBootApplication
// other stuff
@ConfigurationPropertiesScan("path.to.my.config.class")
public class Application implements CommandLineRunner {

    public static void main(final String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        application.addInitializers(new ConfigurationInitializer());
        application.run(args);
    }

然后当我尝试在我的代码中使用此类时:

@Data
@Slf4j
@Component
public class SomeClass extends SomeOtherClass<ILoggingEvent> {

    @Autowired
    private MdcConfig mdcConfig;

    List<String> mdcAllowedItems = mdcConfig.getAllowedItems(); // null pointer on "mdcConfig"
java spring spring-boot autowired configurationproperties
1个回答
0
投票

问题实际上是你的代码。

@Data
@Slf4j
@Component
public class SomeClass extends SomeOtherClass<ILoggingEvent> {

    @Autowired
    private MdcConfig mdcConfig;

    List<String> mdcAllowedItems = mdcConfig.getAllowedItems();

当您使用字段注入时,字段

mdcConfig
将在对象构造完成后被填充。然而 mdcAllowedItems
 正在尝试在对象初始化期间进行初始化。初始化发生在 Spring 进行更改以注入字段之前,因此会失败。

您应该将字段的初始化移至

@PostConstruct

 方法,该方法将在字段构造和注入后调用。然而,最好的解决方案是使用构造函数注入并在构造函数中初始化 
mdcAllowedItems

@Data @Slf4j @Component public class SomeClass extends SomeOtherClass<ILoggingEvent> { private final MdcConfig mdcConfig; List<String> mdcAllowedItems; public SomeClass(MdcConfig mdcConfig) { this.mdcConfig=mdcConfig; this.mdcAllowedItems = mdcConfig.getAllowedItems(); }
    
© www.soinside.com 2019 - 2024. All rights reserved.