【问题标题】:Spring Boot conditional on @ConfigurationPropertiesSpring Boot 以 @ConfigurationProperties 为条件
【发布时间】:2015-03-06 20:40:28
【问题描述】:

我有一个身份验证服务,我想在运行时自动配置它,但它会被模拟用于开发和测试。我想使用@ConfigurationProperties 功能来定义必要的参数,但我还需要能够仅根据是否配置实时服务有条件地创建AuthenticationManager 实例。

我想采用的方法是使用 @ConditionalOnBean(AuthProperties.class) 之类的东西,但是 无论属性是否存在,Spring Boot 都会创建我的 @ConfigurationProperties 类的 bean。我可以将验证注释应用于字段,但如果未配置实时服务,则上下文根本不会启动。

是否有一种简洁的方法可以使配置部分以 @ConfigurationProperties 类中指定的属性为条件而不重复 @ConditionalOnProperty 中的属性名称?

【问题讨论】:

  • @ConfigurationProperties 对象也可用于指定默认值,@ConditionalOnProperty (当然)不会采用这些默认值。所以这仍然是一个非常相关的问题。

标签: java spring spring-boot


【解决方案1】:

你不能只使用你的 application-some_profile.properties 文件的配置文件,然后像这样有条件地创建你的属性 bean

@Profile("some_profile")
@Component
@ConfigurationProperties(prefix = "some.selector")

public Class YourConfiguration{
  private property option;
}

这样,它只会根据您选择实时或模拟的配置文件有条件地创建。 您可以使用为您的@Configuration 身份验证类选择的配置文件以获取单独的方法,也可以使用@ConditionalOnBean。这就是个人资料的用途,或者我可能误解了这个问题。

【讨论】:

  • Spring Boot 自动配置系统的全部意义在于适应外部配置信息,而不必指定只提供冗余信息的切换,基本上是迷你配置文件。
  • 对不起,我没有注意到自动配置。我没有想到任何干净的东西 @Component @ConfigurationProperties(prefix = "some.selector") @Conditional(YourConfiguration.class) public Class YourConfiguration implements Condition { private property option ; @Override public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) { //一些硬编码的属性检查返回 (System.getProperty("servicedefault") == null); } }` 不干净,但这就是@Condidional 的工作方式,bean 将根据条件注册,否则无法注册
【解决方案2】:

我有一个类似的问题,我可以使用 Spring Boot 和 Java 8 用这种方法解决它,希望它可以帮助某人:

@Configuration
@PropertySources({
    @PropertySource("classpath:integration.properties"),
    @PropertySource(value = "classpath:integration-${spring.profiles.active}.properties", ignoreResourceNotFound = true)
})
@ConfigurationProperties(prefix = "integration")
public class IntegrationProperties {

    private String user;

    private String password;

    private String projectId;

    ....

}

integration.properties

integration.user=User
integration.password=Password
integration.project-id=123

integration-prod.properties

integration.project-id=897

Spring Boot 将使用属性文件创建 bean,而对于生产(使用配置文件 prod),它将使用另一个文件并覆盖 project-id。当您不使用prod 配置文件时,ignoreResourceNotFound = true 将在启动时避免 FileNotFoundException。

【讨论】:

    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 2015-06-17
    • 2018-02-07
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    相关资源
    最近更新 更多