2

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

环境

  • 春季启动 2.0.2
  • java版本“10.0.1” 2018-04-17 Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10), Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, 混合模式)
  • OSX 10.13.4

我的代码

应用程序-local.properties:

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带有字符串注释的方法参数。

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

4

1 回答 1

3

在您的情况下,没有必要使用@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。

于 2018-05-29T22:33:34.977 回答