Как работать со сторонними @ConfigurationProperties @Bean?

Я использую IntellijIdea и Gradle. Конфигурация Gradle:

...
apply plugin: 'propdeps'
apply plugin: 'propdeps-idea'
apply plugin: 'propdeps-maven'
buildscript {
    repositories {
        maven { url 'http://repo.spring.io/plugins-release' }
    }
    dependencies {
        classpath 'org.springframework.build.gradle:propdeps-plugin:0.0.7'
    }
}

compileJava.dependsOn(processResources)
dependencies {
    ...
    optional group: 'org.springframework.boot', name: 'spring-boot-configuration-processor', version: '1.4.0.RELEASE'
}

Хорошо, для создания моих собственных свойств мне нужно:

@Component
@ConfigurationProperties("own.prefix")
@Data
public class TestProps {
    public String field;
}

@Configuration
@EnableConfigurationProperties(TestProps.class)
public class AppConf {}

И после того, как я перестроил проект Spring-Boot-Configuration-Processor, сгенерировал новый META-INFO, поэтому в application.properties я могу использовать own.prefix.field= и Spring увидеть его.

Но что мне делать со сторонним классом конфигурации? Документы http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html говорят:

А также используя @ConfigurationProperties чтобы аннотировать класс, вы также можете использовать его на @Bean методы. Это может быть особенно полезно, когда вы хотите привязать свойства к сторонним компонентам, которые находятся вне вашего контроля.

Чтобы настроить bean-компонент из свойств Environment, добавьте @ConfigurationProperties к его регистрации бина:

@ConfigurationProperties(prefix = "foo")
@Bean
public FooComponent fooComponent() {
    ...
}

Любое свойство, определенное с префиксом foo, будет сопоставлено с этим bean-компонентом FooComponent способом, аналогичным описанному выше в примере ConnectionProperties.

Хорошо. Давай попробуем. Например, я объявляю bean-компонент как gide ( https://spring.io/guides/tutorials/spring-boot-oauth2/):

@Configuration
@EnableOAuth2Sso
public class SocialConfig {

    @Bean
    @ConfigurationProperties("facebook.client")
    OAuth2ProtectedResourceDetails facebook() {
        return new AuthorizationCodeResourceDetails();
    }

    @Bean
    @ConfigurationProperties("facebook.resource")
    ResourceServerProperties facebookResource() {
        return new ResourceServerProperties();
    }
}

Но после перестройки свойства проекта facebook.client и facebook.resource не существуют в моем application.properties.

Также я попытался добавить SocialConfig.class в

@Configuration
@EnableConfigurationProperties(SocialConfig.class)
public class AppConf {}

После восстановления это все еще не работает. А вот так:

@Configuration
@EnableConfigurationProperties
public class AppConf {}

Все тот же.

Что я делаю неправильно? Также извините за мой английский:)

1 ответ

Решение

Что вы делаете неправильно, так это то, что методы в вашем @Configuration класс не публичный. Просто добавь public в facebook а также facebookResource и у тебя все будет хорошо. Я только что обработал этот документ в c4cb8317 и представил PR, чтобы исправить учебник, который вы использовали в качестве основы.

Также сгенерированные метаданные были в основном пустыми, поскольку вложенные объекты не были помечены @NestedConfigurationProperty, Я отправил еще один запрос, чтобы исправить это.

Другие вопросы по тегам