如何使用 spring-boot 外部化数据源配置?

2024-01-02

我目前正在尝试将现有的 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做类似的事情,但我无法将命令行属性传递到我的应用程序,并且需要从我的应用程序内执行此配置。据我所知,此属性不可能做到这一点。

EDIT:环境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 配置)


如何使用外部配置在本节 http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-configSpring Boot 参考指南。

The spring.config.location http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files是包含您的目录的路径application.properties文件。它采用逗号分隔的值列表,以便您可以指定多个路径。它不需要通配符。它是一个路径,因此不是匹配多个属性文件的表达式。如果您想更改默认值application然后使用spring.config.name让它成为别的东西。

Spring Boot 的默认设置与 Spring Boot 的其余部分一样(使用默认配置等)。

如果您想做更广泛的(预)配置,您应该使用ApplicationContextInitializer手动添加PropertySourceEnvironment。这个有提到here http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-boot-application.html#howto-customize-the-environment-or-application-context在 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);
        }   
    }
}

然后在构建应用程序对象时添加它,如下所示。

public class ServletInitializer extends SpringBootServletInitializer {

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 spring-boot 外部化数据源配置? 的相关文章

随机推荐

  • 当您在 ASP.NET 2.0 中使用登录控件时,将值或数据从一个页面传递到另一页面

    我在登录页面中使用 ASP NET 2 0 中提供的登录控件 一旦用户通过数据库身份验证成功 我就会将用户重定向到 home aspx 在这里 我也想将用户的名称传递给 home aspx 以便用户在 home aspx 中看到他 她的名字
  • S4错误:可以定义方法,但泛型函数是隐式的,无法更改

    我正在通过 S4 创建以下方法 name title Expand outputs description Operator outputs of function create return expanded creation expor
  • 我在哪里可以获得 JOGL JAR?

    这可能听起来很愚蠢 但我不知道在哪里可以找到 JOGL JAR 我搜索了他们的网站 http jogamp org jogl www http jogamp org jogl www 并且找不到它 有人可以帮忙吗 谢谢 blargman 看
  • 异步函数javascript没有在后台运行?

    console log 1 console log 2 async function a for let i 0 i lt 1000000000 i for let i 0 i lt 1000000000 i a then gt conso
  • 在MySQL中模拟滞后函数

    time company quote 0000 00 00 00 00 00 GOOGLE 40 2012 07 02 21 28 05 GOOGLE 60 2012 07 02 21 28 51 SAP 60 2012 07 02 21
  • 如何使用搜索参数搜索Html表格数据

    我有一个 HTML 表 我正在其中填充 JSON 数据 我提供了一个搜索字段 它提供了搜索表数据 现在我想做的是 我有一个select由表头名称组成的下拉列表 单击该选项后 我只想搜索该特定列 假设这里我有一个列名称为User Code 因
  • 如何从 Pinterest API 获取搜索源

    我正在寻找以下的搜索源Pinterest移动应用程序API 我可以知道如何获取搜索源吗Pinterest API 自 2019 年起 此功能已被弃用 我认为this https github com cypherpunk99 guipint
  • Smalltalk中new和initialize的区别?

    新手问题 new和initialize有什么区别 确切地 当您发送消息 new时 它不仅创建对象 而且发送消息 initialize 这使您可以自定义对象的初始化 看 Behavior gt gt new Answer a new init
  • 在 Windows 上查找使用端口的进程的 PID

    我的服务在经典启动时崩溃 java rmi server ExportException Listen failed on port 9999 我怎样才能找到杀死它的进程 只需打开命令 shell 并输入 假设您的端口是 123456 ne
  • React-apollo 的动态突变文档

    我需要动态更改我的突变文档 以便能够在单个突变中创建多个项目 所以我有这个功能createOrderName它需要一个整数并能够创建正确的突变文档 例如 createOrderName 2 gets mutation createOrder
  • Ruby 中解析 HTML 文档的方法?

    就像 PHP 中的 DOMDocument 类一样 RUBY 中是否有任何类 即核心 RUBY 可以从 HTML 文档中解析并获取节点元素值 目前还没有内置的 HTML 解析器 但有一些非常好的解析器可用 特别是Nokogiri http
  • 如何使用 CarrierWave 重新组织现有文件夹层次结构?

    我正在尝试使用以下命令在我的 S3 存储桶中移动文件CarrierWave重新组织文件夹结构 我来到一个现有的 Rails 应用程序 其中一个类的所有图像都被上传到一个名为的文件夹中 uploads 这会导致问题 如果两个用户上传具有相同文
  • 使用paint(Graphics p)时删除java中的一行?

    我使用以下函数画了一条线 public void paint Graphics p super paint p p drawLine 600 200 580 250 我想知道有没有办法删除这一行 那么是否可以在main 程序的方法 您可以使
  • 使用 JavaScript 重新排列 ListBox 元素会导致回发时发生事件验证错误

    我创建了一个项目交换器控件 其中包含两个列表框和一些按钮 允许我在两个列表之间交换项目 交换是使用 javascript 完成的 我还在列表中上下移动项目 基本上 当我将项目移动到右侧的列表框时 我将元素的数据键 GUID 存储在隐藏字段中
  • 有没有办法加快 numpy.where 的循环速度?

    想象一下 您有一个分割图 其中每个对象都由唯一索引标识 例如看起来与此类似 对于每个对象 我想保存它覆盖的像素 但我只能提出标准for循环至今 不幸的是 对于包含数千个单独对象的较大图像 这结果非常慢 至少对于我的真实数据来说是这样 我能以
  • 如何在 Blackberry 中以编程方式发送短信

    如何在黑莓手机中以编程方式发送短信 我在某处读到 我需要服务器端和客户端代码来发送短信 这是真的吗 为了将消息从一个设备发送到另一个设备或从模拟器发送到设备 我真的需要服务器端和客户端代码吗 我在客户端的某个地方找到了这段代码 但我没有得到
  • 这种模式有名字吗? (C# 编译时类型安全,具有不同类型的“params”参数)

    这种模式有名字吗 假设您想要创建一个采用可变数量参数的方法 每个参数都必须是一组固定类型 以任何顺序或组合 之一 并且其中一些类型您无法控制 一种常见的方法是让您的方法采用 Object 类型的参数 并在运行时验证类型 void MyMet
  • as3 - 从父 swf 到子 swf 的调度事件

    我有一个主要的 父 swf 它加载了其他几个swf 如果主 swf 中发生某些情况 我需要将其告知其中一个子 swf 反过来这似乎也很有效 任何子级都可以简单地使用dispatchEvent 并且我可以设置主swf 来侦听该事件 但是 我无
  • 真正的不安全代码性能

    我知道不安全的代码更适合访问 Windows API 之类的东西并进行不安全的类型转换 而不是编写性能更高的代码 但我想问您是否注意到使用它在实际应用程序中带来了任何显着的性能改进与安全的 C 代码相比 一些性能测量 性能优势并不像您想象的
  • 如何使用 spring-boot 外部化数据源配置?

    我目前正在尝试将现有的 spring 应用程序移动到 spring boot 从而重新创建无需启动即可工作的内容 我想从外部源配置一些属性 如 spring datasource 具体来说是一个包含多个属性文件的文件夹 我设置了一个配置类来