当前位置: 首页 > 知识库问答 >
问题:

在Springboot中使用@ConformtorBingwith@条件属性

暨嘉
2023-03-14

我正在使用@Configtor绑定@ConfigurationProperties类似

    @ConstructorBinding
    @ConditionalOnProperty(name = "nexus.orchestration.cloud.model", havingValue = "true", matchIfMissing = false)
    @ConfigurationProperties(value = "nexus.orchestration.model.cloud-bucket", ignoreUnknownFields = false)
    @ToString
    public static class ModelCloudBucket {
        private final CloudBucket cloudBucket;

        public ModelCloudBucket(final CloudProviderEnum provider, final String bucket, final String folder) {
            this.cloudBucket = new CloudBucket(provider, bucket, folder);
        }
    }

我有@EnableConfigurationProperties(FlowCache. ModelCloudBucket.class)在我的主应用程序类上

但是,@条件属性不起作用。如果我的属性是false,并且我注释掉yaml文件中的CloudBucket对象,它在启动时失败,因为它不能绑定云桶属性。如果属性是false,那么该对象不应该是必需的,然后bean应该是null。我如何使这个工作?

共有1个答案

薛元忠
2023-03-14

据我所知,Spring@ConditionalOnProperty@ConfigurationProperties用于两个不同的领域:

  1. @条件属性用于条件注入bean和配置。
  2. @ConfigurationProperties用于外部配置,它来自您的配置文件,如application.properties

从代码中,我假设ModelCloudBucket是一个bean,如果nexus,您需要注入它。编排。云model==true,它将提供者、存储桶和文件夹作为其属性。

因此,我建议使用以下代码:

属性类:

@Configuration
@ConfigurationProperties(prefix = "nexus.orchestration.model.cloud-bucket")
@Data
public class ModelCloudBucketProps {
    private CloudProviderEnum  testProp;
    private String bucket;
    private String folder;
}

以及将被注入属性的原始bean:

@Component
@ConditionalOnProperty(name = "nexus.orchestration.cloud.model", havingValue = "true")
public class ModelCloudBucket {
    ...
    public ModelCloudBucket(ModelCloudBucketProps config) {
         this.cloudBucket = new CloudBucket(config.getProvider(), ...);
    }
}

@EnableConfigurationProperties(FlowCache. ModelCloudBucket.class)可以被删除,因为将通过@Configance注入。

通过这种方式,您可以使用条件控制bean注入,并将其与外部配置初始化分离。

 类似资料:
  • 问题内容: 变量strCSSClass通常具有一个值,但有时为空。 我不想在此输入元素的HTML中包含空的class =“”,这意味着如果strCSSClass为空,我根本就不需要class =属性。 以下是执行条件HTML属性的一种方法: 有没有更优雅的方式做到这一点?具体来说,我可以遵循与元素其他部分中使用的相同的语法:class =“ @ strCSSClass”? 问题答案: 您没有从Ra

  • 问题内容: 我想使用该类填充一个。 我想将条目加载到文件中,然后将其复制到中。 之前,我曾经使用属性文件初始化,但是现在我已经定义了,并且只想在构造函数中对其进行初始化。 较早的方法: 但是现在,我有这个 如何将属性对象分配给此处? 问题答案: 如果我理解正确,则属性中的每个值都是代表整数的字符串。因此,代码如下所示:

  • 问题内容: 如何将sql查询写入hibernate条件? 问题答案: 想我找到了答案。您必须使用Projection.sqlProjection()而不是Projections.sum()。例:

  • 我想启用或禁用具有外部配置的SSL/TLS,这些配置可以在应用程序启动期间提供。应用程序应该支持http和HTTPS的所有crud操作。 既然上面的属性是不推荐使用的,那么我如何在不使用配置文件的情况下实现它。

  • 使用的技术: Spring Boot 1.4.2.Release,Spring 4.3.4.Release,Tymeleaf 2.1.5.Release,Tomcat Embeded 8.5.6、Maven 3、Java 8 我创建了这个服务来发送电子邮件