【问题标题】:Use of configuration properties in @Configuration classes在@Configuration 类中使用配置属性
【发布时间】:2018-11-08 15:48:55
【问题描述】:

是否期望配置属性类在@Configuration 类中可用。

环境

  • Spring Boot 2.0.2
  • java版本“10.0.1” 2018-04-17 Java(TM) SE 运行时环境 18.3 (build 10.0.1+10), Java HotSpot(TM) 64 位服务器 VM 18.3(内部版本 10.0.1+10,混合模式)
  • OSX 10.13.4

我的代码

应用程序本地属性:

s3.bucketName=test-bucket

配置属性

@Validated
@ConfigurationProperties(prefix = "s3")
public class S3ConfigurationProperties {

    @NotBlank
    private String bucketName;

    public String getBucketName() {
        return bucketName;
    }

    public void setBucketName(final String bucketName) {
        this.bucketName = bucketName;
    }
}

配置类

@Configuration
@Profile("local")
@EnableConfigurationProperties(S3ConfigurationProperties.class)
public class LocalS3Configuration {

    @Autowired
    private S3ConfigurationProperties properties;

    @Value("${s3.bucketName}")
    private String bucket;

    @Bean(destroyMethod = "shutdown")
    public AmazonS3 amazonS3(@Value("${local.s3.endpoint}") final String s3Endpoint, @Value("${s3.bucketName}") final String bucketName) {
        // use properties...
        final String bucketInjectedToMethod = bucketName; // works
        final String bucketInjectedViaProperties = properties.getBucketName(); // null
        final String bucketInjectedInClass = bucket; // null

    }

}

观察到的行为

如果我将S3ConfigurationProperties 作为配置类的字段或amazonS3 方法的参数注入,则实例为non-null,但其中的bucketName 属性为null

通过@Value将字符串注入类也是null

我可以让它工作的唯一方法是使用注释为@Value 的方法参数和一个字符串。

这是预期的行为还是可能是错误?

【问题讨论】:

    标签: spring-boot spring-boot-configuration


    【解决方案1】:

    在您的情况下,没有必要使用@EnableConfigurationProperties。您可以将@Configuration 放入S3ConfigurationProperties

    @Configuration
    @ConfigurationProperties(prefix = "s3")
    public class S3ConfigurationProperties {
    
        private String bucketName;
    
        //getter and setter
    }
    

    所以,现在你可以将它注入LocalS3Configuration

    @Profile("local")
    @Configuration
    public class LocalS3Configuration {
    
        @Autowired
        private S3ConfigurationProperties properties;
    
        @Value(("${s3.bucketName}"))
        private String bucketName;
    
        @Bean(destroyMethod = "shutdown")
        public AmazonS3 amazonS3() {
    
            final String bucketInjectedToMethod = bucketName;
            final String bucketInjectedViaProperties = properties.getBucketName();
            ...
        }
    }
    

    注解@Configuration 将类注册为一个bean,并允许您将其注入另一个bean。

    【讨论】:

    • 感谢您的尝试,但这会在尝试使用 properties 的行上导致 NPE `java.lang.NullPointerException: null`。
    • 嘿伙计,我更新了代码。对我来说,它工作正常。您是否删除了 amazonS3() 方法中的参数?
    • 嗨,我刚刚仔细检查过,是的,我已经从方法 args 中删除了参数。使用这种方法,这两个值都是null(bucketName 和属性):(您是否也在使用 boot 2.0.2,我觉得这曾经在 1.X 中工作,但我可能是错的。
    • 仅供参考:突出问题的代码版本:github.com/davidgoate/spring-cloud-configuration-issue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2016-08-22
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多