Невозможно автоматически подключить класс ConfigurationProperties [дубликат]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Невозможно автоматически подключить класс ConfigurationProperties [дубликат]

Сообщение Anonymous »

Я не могу автоматически связать класс свойств конфигурации. Экземпляр всегда равен нулю.
Я следил за этой статьей: 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, и this.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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»