我无法自动装配配置属性类。实例始终为空。
我关注了这篇文章: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"
问题实际上是你的代码。
@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();
}