其他分享
首页 > 其他分享> > 如何使用Spring-Boot外部化数据源配置?

如何使用Spring-Boot外部化数据源配置?

作者:互联网

我目前正在尝试将现有的spring应用程序移至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;
}

这似乎适用于大多数事情(例如amqp或我自己的配置属性),但是当我尝试使用spring-data-jpa时,它们将被忽略.基本上在这些文件中设置spring.datasource.url(以及其他用于自动配置的内容)无效.

通过查看PropertySourcesPropertyResolver的日志,我发现这些配置程序属于localProperties组,该组在查找spring.datasource.*时不使用.

有没有一种方法可以解决此问题,或者有更好的方法将外部属性文件添加到我的上下文中?

我知道我可以将spring.config.location设置为执行类似的操作,但是我无法将命令行属性传递给我的应用程序,因此需要在我的应用程序中执行此配置.此属性无法实现.

编辑:设置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");
    }
}

尝试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");
    }
}

在这两种情况下,外部属性都没有被拾取(即使在以前工作过的地方,例如amqp配置)

解决方法:

Spring Boot参考指南的this section中说明了如何使用外部配置.

spring.config.location是包含您的application.properties文件的目录的路径.它采用逗号分隔的值列表,因此您可以指定多个路径.它不需要通配符.这是一个路径,不是匹配多个属性文件的表达式.如果要更改默认应用程序,请使用spring.config.name进行其他更改.

Spring Boot的默认值被视为Spring Boot的其余部分(具有默认配置等).

如果要进行更广泛的(预)配置,则应使用ApplicationContextInitializer手动将PropertySources添加到环境中.在Spring Boot参考指南中提到了here.

有关初始化程序外观的示例.

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);
        }   
    }
}

然后,在构建您的应用程序对象时,如下添加它.

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(CampaignServiceStarter.class)
            .initializers(new ConfigurationInitializer());
    }
}

现在,应该将配置添加到属性源列表中.

标签:spring-boot,spring-data-jpa,spring
来源: https://codeday.me/bug/20191120/2043199.html