如何仅在某个配置文件处于活动状态时验证配置属性?

时间:2018-01-08 03:19:18

标签: java spring-boot

有没有办法让某个属性不为空,只有当某个配置文件处于活动状态时才会生效?

@Data
@Component
@ConfigurationProperties(prefix = "sample")
@Validated
public class SampleProperties {

    @NotNull
    private String sample1;

    @NotNull
    @Valid
    private MoreProperties more = new MoreProperties()


    @Data
    public static class MoreProperties {

        @NotNull // ← This should not be null only if the prod profile is active
        private String sample2;

    }
}

1 个答案:

答案 0 :(得分:1)

如何使用两个@ConfigurationProperties类。

像这样:

@Validated
@ConfigurationProperties(prefix = "sample")
public class SampleProperties {

  @NotNull
  private String sample1;

  // Getters + Setters
}

就像这样

@Validated
@ConfigurationProperties(prefix = "sample")
public class SamplePropertiesForProfile extends SampleProperties {

  @NotNull // ← This should not be null only if the prod profile is active
  private String sample2;

  // Getters + Setters
}

只有在正确的配置文件处于活动状态时才使用这些类作为bean。 @EnableConfigurationProperties@ConfigurationProperties类作为bean提供。 我比@Component类的@ConfigurationProperties注释更喜欢这个,因为它保证只在需要时才创建bean。 我认为@ConfigurationProperties是一个“愚蠢的人”。容器的属性,不知道它们的用法,因此它不知道何时需要,何时不知道。

@Configuration
@Profile("!yourDesiredProfile")
@EnableConfigurationProperties(SampleProperties.class)
public class SampleNotProfileConfiguration {

  private readonly SampleProperties sampleProperties;

  @Autowired
  public SampleNotProfileConfiguration(SampleProperties sampleProperties){
    this.sampleProperties = sampleProperties;
  }

  // Configure your beans with the properties required for this profile
}


@Configuration
@Profile("yourDesiredProfile")
@EnableConfigurationProperties(SamplePropertiesForProfile .class)
public class SampleProfileConfiguration {

  private readonly SamplePropertiesForProfile samplePropertiesForProfile ;

  @Autowired
  public SampleProfileConfiguration (SamplePropertiesForProfile samplePropertiesForProfile ){
    this.samplePropertiesForProfile = samplePropertiesForProfile ;
  }

  // Configure your beans with the properties required for this profile
}

执行此操作,您可以为具有显式配置属性的每个配置文件进行显式配置。 即使名称@ConfigurationProperties已经声明此类包含properties的{​​{1}}。这些属性应符合configuration类的要求。 因此,如果应该以不同的方式为给定的配置文件配置bean,则应该是另一个@Configuration,然后需要另一个显式的@Configuration

目前无法验证此解决方案,但由于我对@ConfigurationProperties的理解,这应该起作用,看起来比混合不同配置文件的属性更加干净。