我可以在 Spring Boot 应用程序中使用 xml 属性文件而不是 application.properties 吗?

Jim*_*imo 4 xml properties spring-boot

在我们的Spring Boot应用程序中,我们使用application.properties,但运营团队要求使用基于 XML 的属性文件。格式很简单。如果apllication.properties看起来像:

com.mail.host=mail_host
db.connection.port=1521
Run Code Online (Sandbox Code Playgroud)

相应的 xml 应该是:

<XML>
    <com>
        <mail>
            <host>
                mail_host
            </host>
        </mail>
    </com>
    <db>
        <connection>
            <port>
                1521
            </port>
        </connection>
    </db>
</XML>
Run Code Online (Sandbox Code Playgroud)

我们实现了它,但Spring Boot仍在寻找application.properties以获取其特定属性。这有点不方便。我们希望将所有属性放在一个地方,即 - XML 文件。

覆盖Spring Boot的默认行为以使其在 XML 文件中查找属性的最佳方法是什么?(当然,它需要一些自定义代码,因为Spring Boot理解简单的属性格式(如key=value)和 YAML 格式,但不理解XML。)

Avi*_*vis 5

Spring Boot 不仅从扩展名为 .properties 和 .yaml 的文件中读取属性,还从 .xml 中读取属性。而不是 application.properties 只是在您的资源文件夹中以以下格式提供 application.xml :-

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>Application properties in XML format</comment>
    <entry key="com.mail.host">mail_host</entry>
    <entry key="db.connection.port">1521</entry>
</properties>
Run Code Online (Sandbox Code Playgroud)

在您的类文件中,您可以简单地设置值,就像我们对任何属性或 yaml 文件所做的那样,@Value("${com.mail.host}")即将在要注释的任何实例变量上设置相应的值。


Jim*_*imo 1

问题不在于编写我们自己的 XML 解析器。我们已经有了。问题是如何让 Spring Boot 从 XML 文件中读取特定属性,因为 SB 会在应用程序启动时尝试从 application.properties 自动读取它们,而我们无法让它使用我们自定义的 XML 解析器。

看起来比我想象的要容易。当应用程序启动时,我们的代码会调用一个静态初始化方法,该方法使用我们的自定义解析器从 XML 文件中读取 props。它将 Spring Boot 特定属性设置为系统属性,通过调用:

System.setProperty(...)
Run Code Online (Sandbox Code Playgroud)

稍后,Spring Boot 就能够获取这些 prop 值,就像它们在 application.properties 中给出一样。