Я просто экспериментирую с Spring Webflux 5.0.0 и Kotlin, и у меня проблема с загрузкой конфигурации из application.yml
Для базового проекта я начинаю с этого примера spring-kotlin-functional
Но есть только ручная загрузка бобов и маршрутизация без какой-либо загрузки из файлов конфигурации или пример, как таким образом реализовать аналог класса @ConfigurationProperties.
Я пытаюсь заняться средой в разделе бобов:
data class DbConfig( var url: String = "", var user: String = "", var password: String = "" ) fun beans(): BeanDefinitionDsl = beans { bean { //try to load config from path=db to data class DbConfig env.getProperty("db", DbConfig::class.java) } bean<DBConfiguration>() //controllers bean { StatsController(ref()) } bean { UserController(ref()) } //repository bean { UserRepository(ref()) } //services bean { StatsService(ref()) } //routes bean { Routes(ref(), ref()) } bean("webHandler") { RouterFunctions.toWebHandler(ref<Routes>().router(), HandlerStrategies.builder().viewResolver(ref()).build()) } //view resolver bean { val prefix = "classpath:/templates/" val suffix = ".mustache" val loader = MustacheResourceTemplateLoader(prefix, suffix) MustacheViewResolver(Mustache.compiler().withLoader(loader)).apply { setPrefix(prefix) setSuffix(suffix) } } }
но в среде есть только системные свойства
Итак, вопрос в том, как загрузить конфигурацию из application.yml и как реализовать аналог @ConfigurationProperties в таком функциональном стиле?
И правильно ли я понимаю, что без весенней загрузки все аннотации (например, @Bean, @Repository, @Transactional и другие) не будут работать для Beans?
Мои источники: github
Обновление 2017-10-21
Найти решение. Проблема была связана с тем, что там не было никакого BeanPostProcessor. И после включения этих двух процессоров:
bean<CommonAnnotationBeanPostProcessor>() bean<ConfigurationClassPostProcessor>()
аннотации @Configuration
, @Bean
и @PostConstruct
начинают работать. Но аннотация @ConfigurationProperties
существует только в зависимости от spring-boot
, а yml-классы разбора я нахожу только в spring-boot-starter
..
После включения зависимости spring-boot-starter
и добавления bean<ConfigurationPropertiesBindingPostProcessor>()
в раздел beans, аннотация @ConfigurationProperties
начнет работать, но config из application.yml также не был включен. Поэтому я добавляю этот раздел:
val resource = ClassPathResource("/application.yml") val sourceLoader = YamlPropertySourceLoader() val properties = sourceLoader.load("main config", resource, null) environment.propertySources.addFirst(properties)
к конфигурации GenericApplicationContext
. И теперь все работает так, как я ожидаю, но с включением зависимости spring-boot-starter
.
Полный образец кода: версия с исправлениями
Весенняя загрузка – это просто управление зависимостями, которые создают автоматическую конфигурацию, которую вы можете переопределить. Все функции унаследованы от Spring framework и модулей. Таким образом, вы можете сделать то же самое с загрузкой или без нее.
Я еще не на webflux. Но когда вы ссылаетесь на свои другие бобы, вам нужно указать конфигурационный компонент в другом месте.
Я уверен, что помогу вам с этим …