#spring-boot
#spring-boot
Вопрос:
Ребята, я пытаюсь получить доступ к свойствам конфигурации из класса, который я расширил из зависимости. По-видимому, класс config возвращает нулевой указатель в моем классе реализации (CustomUtil).
pom.xml
...
<dependency>
<groupId>com.utilapp</groupId> //3rd party library that I need to use
<artifactId>util-lib</artifactId>
</dependency>
...
BaseUtil — это результат зависимости. CustomUtil — это компонент в моем приложении SpringBoot, и я переопределяю метод, как показано ниже, чтобы проверить ключ из свойства конфигурации ignoreKeyList .
package com.myapp
...
@Component
public class CustomUtil extends BaseUtil {
@Autowired
private ClientConfig clientConfig; // This returns null!
@Override
protected boolean shouldExcludeFromList(String key) {
return this.clientConfig.getIgnoreKeyList.contains(key); // their library/util excludes certain keywords from the content being formatted
}
}
Класс конфигурации в моем приложении SpringBoot.
package com.myapp
...
@Configuration
@Getter
@Setter
public class ClientConfig {
@Value("${myapp.ignorekeys}")
private List<String> ignoreKeyList;
...
...
}
Основной класс в моем приложении.
package com.myapp
...
@SpringBootApplication
public class MyClientApplication {
public static void main(String[] args) {
SpringApplication.run(MyClientApplication.class, args);
}
}
Класс реализации сервиса в моем приложении SpringBoot.
package com.myapp
import com.utilapp.formatters.FormatBuilder;
import com.utilapp.formatters.TextFormatter;
...
@Service
public class ServiceImpl implements MyService {
@Autowired
private ClientConfig clientConfig; // works here!
public String formatContent(String content) {
TextFormatter formatter = this.getTextFormatter();
return formatter.parseAndFormat(content);
}
private TextFormatter getTextFormatter() {
return FormatBuilder.custom() // FormatBuilder is from the dependency
.withApplication(this.clientConfig.getAppName()) // In their library, the BaseUtil gets instantiated which am extending in my CustomUtil bean
...
...
.withIndentSupport(Boolean.TRUE)
.build();
}
}
Контроллер в моем приложении
package com.myapp
...
@RestController
@RequestMapping("/app/v1")
public class StyleController {
@Autowired
private MyService myService;
@GetMapping("/format")
public String formatContent(@RequestParam String content) {
return this.myService.formatContent(content);
}
}
Когда я отлаживаю ClientConfig, он загружает свойства из файла конфигурации; application.properties в src main resources .
Но по какой-то причине ClientConfig возвращает null из компонента CustomUtil. Не уверен, почему!
Первоначально я думал, что это связано с упорядочением создания экземпляра компонента. Я пытался поиграть с @Order, @dependsOn, @ComponentScan, @ScanBasePackages и т.д., но ни один из них не дает результатов.
Пожалуйста, любые указания / рекомендации. Спасибо.
Комментарии:
1. Как вы получаете ссылку на
CustomUtil
экземпляр, для которого установленаclientConfig
переменнаяnull
? Пожалуйста, покажите код, который вызывает создание экземпляра этого компонента, и код, который получает к нему доступ и использует его.2. @Steve Я отредактировал свой пост, чтобы продемонстрировать ServiceImpl amp; Controller. Честно говоря, аннотация компонента в CustomUtil не имеет никакого эффекта. Я поставил это ради автоматической настройки ClientConfig. Когда formatContent(..) из ServiceImpl вызывается через поток вызовов Rest, вызывается метод shouldExcludeFromList(..) из CustomUtil . Мне просто нужно включить ключи из моего приложения, и они должны проходить через конфигурацию, которая, по-видимому, в моем случае равна null. Очевидно, что мое понимание потока создания экземпляра, обрабатываемого Springboot, не соответствует действительности. Приветствуются любые указатели / предложения. Спасибо.