Я следил за этой статьей: https://www.baeldung.com/configuration- ... ng-boot-22< /p>
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 allowedItems;
private Map replacementItems;
public List getAllowedItems() {
return allowedItems;
}
public void setAllowedItems(List allowedItems) {
this.allowedItems = allowedItems;
}
public Map getReplacementItems() {
return replacementItems;
}
public void setReplacementItems(Map 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 {
@Autowired
private MdcConfig mdcConfig;
@Override
protected void append(ILoggingEvent event) {
// ... other stuff
List mdcAllowedItems = mdcConfig.getAllowedItems(); // null pointer on "mdcConfig"
}
Извините, если вопрос был написан неправильно. Я знаю, почему экземпляр равен нулю. Я не знаю, как это исправить с помощью Spring.
Связанные вопросы объясняют только, почему это происходит, а не как это исправить.
Поэтому они бесполезны.
Порядок инициализации полей в компоненте
Это объясняет, что вызывается конструктор по умолчанию. Там не объясняется, что делать, но я полагаю, что предлагается поместить создание экземпляра в конструктор по умолчанию?
Так что я могу сделать:
Код: Выделить всё
public class SomeClass extends SomeOtherClass {
private MdcConfig mdcConfig;
public SomeClass() {
this.super();
// ... some other stuff
this.mdcConfig = new MdcConfig();
}
}
Но это «МОЙ» экземпляр MdcConfig, а не экземпляр, созданный Spring при запуске приложения, который содержит фактические значения конфигурации из-за некоторой «магии», происходящей при создании экземпляра Spring. класс.
Таким образом, даже mdcConfig не имеет значения NULL, например, вызов mdcConfig.getAllowedItems() вернет значение NULL.
@Autowired bean-компонент имеет значение null, когда на него ссылаются в конструкторе другого bean-компонента
Это предполагает использование @PostConstruct. Но не объясняется, куда его поместить и что делать в том методе, куда он был помещен. Я не могу открыть ссылки в проверенном ответе. Возможно, оно устарело или потому, что я нахожусь за брандмауэром компании. Я погуглил об этом, но понятия не имею, чем это поможет.
Значит, я просто думаю, что мне следует сделать что-то подобное?
Код: Выделить всё
public class SomeClass extends SomeOtherClass {
@Autowired
private MdcConfig mdcConfig;
@Override
@PostConstruct
protected void append(ILoggingEvent event) {
// ... other stuff
List mdcAllowedItems = mdcConfig.getAllowedItems(); // still null pointer on "mdcConfig"
}
Код: Выделить всё
@Data
@Slf4j
@Component
public class SomeClass extends SomeOtherClass {
@Autowired
private MdcConfig mdcConfig;
@PostConstruct
public void init() {
// not even sure what to do here then
this.mdcConfig = new MdcConfig(); // same as mentioned before it's not null but doesn't hold config values
}
@Override
protected void append(ILoggingEvent event) {
// ... other stuff
List mdcAllowedItems = mdcConfig.getAllowedItems(); // null pointer on "mdcConfig"
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... ties-class
Мобильная версия