Spring boot получает @value внутри класса, расширяющего зависимость

#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, не соответствует действительности. Приветствуются любые указатели / предложения. Спасибо.