在自定义的Spring Boot启动程序中是否可以有一个默认的application.yml?

时间:2019-11-28 16:03:25

标签: java spring spring-boot

我的自定义Spring Boot启动程序和用作依赖项的Spring Boot应用程序使用者遇到了问题。我都有一个application.yml,但似乎我要寻找的配置只有在使用者中定义时才有效。

我在启动器中的配置如下:

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "security")
public class StarterSecurityConfig {
    private boolean jwtEnabled;
    private String[] unsecuredPaths;
    private String[] securedPaths;
}

我在AutoConfiguration类中定义了这个bean:

@Bean
public StarterSecurityConfig starterSecurityConfig() {
    return new StarterSecurityConfig();
}

具有此application.yml和另一个变量的使用者可以完美地检索它:

    security:
  jwt-enabled: true
  secured-paths:
    - /user/**
  unsecured-paths:
    - /**

但是,如果我将其从使用者中删除并将其放入启动器的application.yml中,则启动器bean在创建它们时将不具有这些属性。

也许我想念什么吗?

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,上周我就遇到了这样的问题... 我正在检查此问题,但有一些发现(官方文档不支持它们):如果添加依赖项并想使用其资源,则可能是两个application.yml文件都位于同一位置-{{1} },或者它们无法一起加载,或者其中一个被其他覆盖。无论如何,在我的应用程序中,它都不起作用。

直接简单的解决方案,如果您只需要从依赖的配置文件中加载配置-重命名并以可能的方式加载(从YAML,属性源的初始化程序等手动加载)

但是,如果此配置文件应在任何地方使用,我们可以在上下文中手动加载属性。在依赖项(您的情况下是用户)中,创建另一个配置文件,例如Consumer-application.yml和@configuration类中的下一个bean:

classpath:application.yml

并且您可以在两个应用程序中使用带有@Value的YAML文件中的属性。

但是最简单的方法-使用属性配置。在这种情况下,您只需在消费者中设置@Bean public static PropertySourcesPlaceholderConfigurer properties() { var propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer(); var yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean(); yamlPropertiesFactoryBean.setResources(new ClassPathResource("consumer-application.yaml")); propertySourcesPlaceholderConfigurer.setProperties(yamlPropertiesFactoryBean.getObject()); return propertySourcesPlaceholderConfigurer; } ,然后在@PropertySource("classpath:consumer-application.properties")中设置 就我而言,这两种变体都能正常工作。

答案 1 :(得分:0)

您可以尝试在启动程序本身上初始化成员变量。如果消费者想覆盖这些值,则可以使用应用程序配置来实现。

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "security")
public class StarterSecurityConfig {
    private boolean jwtEnabled = true;
    private String[] unsecuredPaths = { "/user/**" };
    private String[] securedPaths = { "/**" };
}

有更多想法:

我会将jwtEnabled设置为false,并从上述类中删除@Configuration和@ConfigurationProperties,并与其他bean创建一个SecurityAutoConfiguration类。

@Configuration
public class SecurityAutoConfiguration{

   @Bean
   @ConfigurationProperties(prefix = "security")
   public StarterSecurityConfig starterSecurityConfig(){
     return new StarterSecurityConfig();
   }

   @Bean
   @ConditionalOnProperty(value="security.jwtEnabled", havingValue = "true")
   public JwtService jwtService(StarterSecurityConfig starterSecurityConfig) {
     return new JwtService(starterSecurityConfig);
   }   

}

使用者可以使用security.jwtEnabled标志通过其应用程序配置来启用或禁用安全启动器。