Lau*_*res 3 spring spring-data-jpa spring-boot
我目前正在尝试将现有的 spring-application 移动到 spring-boot,因此重新创建无需启动即可工作的内容。
我想从外部源配置一些属性(如 spring.datasource.*)。特别是一个包含多个属性文件的文件夹。
我设置了一个配置类,用于创建如下所示的 propertyPlaceholder 配置器:
@Configuration
public class PropertySourceConfiguration {
@Bean
public static PropertySourcesPlaceholderConfigurer defaultsPlaceHolderConfigurer() throws IOException {
PropertySourcesPlaceholderConfigurer propertyConfigurer = new PropertySourcesPlaceholderConfigurer();
propertyConfigurer.setLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/*-defaults.properties"));
propertyConfigurer.setIgnoreUnresolvablePlaceholders(true);
return propertyConfigurer;
}
@Bean
public static PropertySourcesPlaceholderConfigurer externalPlaceHolderConfigurer() throws IOException {
PropertySourcesPlaceholderConfigurer propertyConfigurer = new PropertySourcesPlaceholderConfigurer();
propertyConfigurer.setLocations(new
PathMatchingResourcePatternResolver().getResources("file:/my-config-path/*.properties"));
propertyConfigurer.setOrder(1);
propertyConfigurer.setIgnoreUnresolvablePlaceholders(true);
return propertyConfigurer;
}
Run Code Online (Sandbox Code Playgroud)
这似乎适用于大多数事情(例如 amqp 或我自己的配置属性),但是当我尝试使用 spring-data-jpa 时,它们会被忽略。基本上spring.datasource.url在这些文件中设置(和其他用于自动配置的东西)不起作用。
查看日志,PropertySourcesPropertyResolver我发现这些配置器属于localProperties查找spring.datasource.*.
有没有办法解决这个问题,或者有更好的方法将外部属性文件添加到我的上下文中?
我知道我可以设置spring.config.location做类似的事情,但我无法将命令行属性传递给我的应用程序,需要在我的应用程序中执行此配置。afaik 这对这个属性是不可能的。
编辑:设置spring.config.location:
尝试 1:
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(CampaignServiceStarter.class);
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.setInitParameter("spring.config.location", "file:/my-config-path/*.properties");
}
}
Run Code Online (Sandbox Code Playgroud)
尝试 2:
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(CampaignServiceStarter.class).properties("spring.config.location=file:/my-config-path/*.properties");
}
}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,根本没有选择外部属性(即使在它以前工作的地方,如 amqp 配置)
Spring Boot 参考指南的这一部分解释了如何使用外部配置。
的spring.config.location是,其中包含您的目录路径application.properties的文件。它需要一个逗号分隔的值列表,因此您可以指定多个路径。它不需要通配符。它是一个路径,因此不是匹配多个属性文件的表达式。如果您想更改默认值,请application使用spring.config.name使其成为其他内容。
Spring Boot 的默认值被认为是 Spring Boot 的其余部分(使用默认配置等)。
如果您想进行更广泛的(预)配置,您应该使用 anApplicationContextInitializer手动将PropertySources添加到Environment. Spring Boot 参考指南中提到了这一点。
初始化程序的外观示例。
public class ConfigurationInitializer implements ApplicationContextInitializer {
private static final String DEFAULT_PROPS = "classpath*:/*-defaults.properties";
private static final String EXTERNAL_PROPS = "file:/my-config-path/*.properties";
public void initialize(ConfigurableApplicationContext applicationContext) {
final Resource[] defaultConfigs = applicationContext.getResources(DEFAULT_PROPS);
final Resource[] externalConfigs = applicationContext.getResources(EXTERNAL_PROPS);
final ConfigurableEnvironment env = applicationContext.getEnvironment();
final MutablePropertySources mps = env.getPropertySources();
for (Resource r : externalConfigs) {
mps.addLast(new ResourcePropertySource(r.getFilename(), r);
}
for (Resource r : defaultConfigs) {
mps.addLast(new ResourcePropertySource(r.getFilename(), r);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在构建应用程序对象时按如下方式添加它。
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(CampaignServiceStarter.class)
.initializers(new ConfigurationInitializer());
}
}
Run Code Online (Sandbox Code Playgroud)
现在应该将配置添加到属性源列表中。
| 归档时间: |
|
| 查看次数: |
6963 次 |
| 最近记录: |