在我们的 Spring Boot 应用程序中,我们使用 application.properties ,但是Ops团队要求使用基于XML的属性文件。格式很简单。如果 apllication.properties 如下所示:
com.mail.host=mail_host
db.connection.port=1521
相应的xml应为:
<XML>
<com>
<mail>
<host>
mail_host
</host>
</mail>
</com>
<db>
<connection>
<port>
1521
</port>
</connection>
</db>
</XML>
我们实现了这一点,但 Spring Boot 仍在寻找 application.properties 以获取其特定属性。这有点不方便。我们希望将所有属性放在一个位置,即 - XML文件。
覆盖 Spring Boot 的默认行为的最佳方法是什么,以使其在XML文件中查找属性? (当然,它需要一些自定义代码,因为 Spring Boot 了解简单的属性格式(如 key = value )和YAML格式,但没有XML。)
答案 0 :(得分:4)
Spring Boot不仅从扩展名为.properties&amp;的文件中读取属性。 .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>
在您的类文件中,您可以简单地设置值,就像我们对任何属性或yaml文件一样,即@Value("${com.mail.host}")
将在它将注释的任何实例变量上设置相应的值。
答案 1 :(得分:0)
如果您绝对必须从自定义xml源加载属性,那么本文可能会有所帮助:
https://coderwall.com/p/mm5ihw/how-to-add-custom-property-source-to-spring-s-environment
它提供了一个在Spring 3中通过Java配置从一些网络源加载自定义属性的示例,但是将代码调整为从Ops团队的XML格式读取到SpringBoot应用程序中应该不会太困难。
答案 2 :(得分:0)
问题不在于编写我们自己的XML解析器。我们已经拥有了。问题是如何使Spring Boot从XML文件中读取特定属性,因为当应用程序启动时,SB会尝试从application.properties自动读取它们,而我们无法使用我们的自定义XML解析器。
看起来比我想象的容易。当应用程序启动时,我们的代码调用静态初始化方法,该方法使用我们的自定义解析器从XML文件中读取道具。它通过调用:
将Spring Boot特定属性设置为系统属性System.setProperty(...)
稍后,Spring Boot能够获取这些prop值,就像它们在application.properties中给出一样。