【问题标题】:How to use @ConfigurationProperties annotation in Spring Boot如何在 Spring Boot 中使用 @ConfigurationProperties 注解
【发布时间】:2021-11-03 15:37:27
【问题描述】:

我正在尝试应用 @ConfigurationProperties 注释以从 application.yml 文件获取映射到代码中我需要它的位置。

这是我目前的代码:

application.yml

repository:
    type:
      big: big
      small: small
      medium: medium
    to:
     database:
      something: "STRING"

configuration.java

@Configuration
@EnableConfigurationProperties
public class SnowflakeRepositoryConfig {

        @Bean
        @ConfigurationProperties(prefix = "repository.type")
        public DatabaseTypeMapping databaseTypeMapping() {
            return new DatabaseTypeMapping();
        }
    
        public static class DatabaseTypeMapping {
            public Map<Type, Type> typeMappingMigration;
    
            public void setMapping(Map<Type, Type> typeMappingMigration) {
                this.typeMappingMigration = typeMappingMigration; }
        }

@Bean
@ConfigurationProperties(prefix = "repository.to.database")
public BrandToDatabaseProperties brandToDatabaseProperties() {
    return new BrandToDatabaseProperties();
}

public static class BrandToDatabaseProperties {
    public Map<Brand, String> mapping;

    public void setMapping(Map<Brand, String> mapping) {
        this.mapping = mapping;
    }
}

在配置文件中,我将它应用到 serviceImpl 类,如下所示:

    @Bean
    public UserDataService getUserData(BrandToDatabaseProperties brandToDatabaseProperties, DatabaseTypeMapping databaseTypeMapping){
       return new UserDataServiceImpl(brandToDatabaseProperties.mapping, databaseTypeMapping.typeMappingMigration);
    }

serviceImpl.java 类中,我这样包含它:

    public class UserDataServiceImpl implements UserDataService {
    
        private final Map<Type, Type> typeMappingMigration;
        private final Map<Brand, String> brandToDatabaseMapping;
    
        public UserDataServiceImpl(Map<Brand, String> brandToDatabaseMapping, Map<Type, Type> typeMappingMigration) {
this.brandToDatabaseMapping = Collections.unmodifiableMap(brandToDatabaseMapping);    
            this.typeMappingMigration = Collections.unmodifiableMap(typeMappingMigration);    
        }

当我尝试启动我的应用程序时,我收到以下错误:

Failed to instantiate [service.UserDataService]: Factory method 'getUserData' threw exception; nested exception is java.lang.NullPointerException

我在这里错过了什么?

【问题讨论】:

  • 你不见了@EnableConfigurationProperties
  • 我在配置类上有它。我用它更新了我的问题
  • @EnableConfigurationProperties(DatabaseTypeMapping.class),我猜
  • 我添加了,现在出现如下错误:No ConfigurationProperties annotation found on 'repository.SnowflakeRepositoryConfig$DatabaseTypeMapping'.
  • @ConfigurationProperties 应该继续类声明。

标签: java spring-boot configurationproperties


【解决方案1】:

您不需要声明 DatabaseTypeMapping 类型的 bean。将ConfigurationProperties注解移到类中,让组件扫描拾取。或者,您可以在 EnableConfigurationProperties 注释中指定类名。

我不能确定,但​​我认为 ConfigurationProperties 不应该在方法上声明,这在逻辑上没有意义。

【讨论】:

  • @ConfigurationProperties 不会被组件扫描激活;它需要@ECP。如果您需要映射属性结构的多个副本,它可以@Bean 上声明。
  • @chrylis-cautiouslyoptimistic- 我没有说ConfigurationProperties 被组件扫描激活。相反,我的回答特别提到了EnableConfigurationProperties。我还明确表示我不确定方法的用法;我不确定“属性结构的多个副本”是什么意思,但我可以看到的唯一用法是将相同的属性映射到多个前缀,这有点做作。跨度>
  • 我更新了我的问题。我有两个配置属性,BrandToDatabaseProperties 正在工作,这就是为什么我没有把它放在我的第一个问题中,但也许有问题,因为它有两个?
  • 您可以看到它们非常相似,BrandToDatabaseProperties 正在工作,而其他 DatabaseTypeMapping 正在抛出异常
猜你喜欢
  • 2019-11-22
  • 1970-01-01
  • 2021-02-17
  • 2019-09-20
  • 2021-12-20
  • 1970-01-01
  • 2020-03-30
  • 2017-05-06
  • 1970-01-01
相关资源
最近更新 更多