我的自定义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在创建它们时将不具有这些属性。
也许我想念什么吗?
答案 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标志通过其应用程序配置来启用或禁用安全启动器。