Spring Boot以@ConfigurationProperties为条件

时间:2015-01-08 16:37:32

标签: java spring spring-boot

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

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

是否有一种干净的方法可以使配置部分取决于@ConfigurationProperties类中指定的属性而不重复@ConditionalOnProperty中的属性名称?

2 个答案:

答案 0 :(得分:0)

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

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

public Class YourConfiguration{
  private property option;
}

这种方式只能根据您选择的实时或模拟配置文件有条件地创建。 您可以使用@Configuration身份验证类的选定配置文件进行单独的方法,也可以使用@ConditionalOnBean。这就是配置文件的用途,或者我误解了这个问题。

答案 1 :(得分:0)

我有类似的问题,我可以使用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。当您不使用ignoreResourceNotFound = true个人资料时,prod将在启动时避免FileNotFoundException。