在我的项目中,我使用基于 XML 的配置,并且我正在尝试读取 application.yml 文件
应用程序.yml
vtp:
config:
priority:
2:
country: 'US'
countryFriend: ['UK','AG']
3:
country: 'IN'
countryFriend: ['UK','AG']
4:
country: 'PO'
countryFriend: ['NL']
5:
country: 'KN'
countryFriend: ['DN']
我可以使用 Spring Boot 来读取它,方法是创建一个 POJO 类来映射如下属性
@Configuration
@ConfigurationProperties(prefix = "vtp.config")
@PropertySource(value = "classpath:application.yml")
public class MeraPriorityConfig {
private Map<String, Config> priority;
public Map<String, Config> getPriority() {
return priority;
}
public void setPriority(Map<String, Config> priority) {
this.priority = priority;
}
}
如何使用基于 XML 的配置执行相同操作?
最佳答案
“ map 中的所有数据”是什么意思!?
discussed/linked solution可以将您的 yaml 文件公开为 java.util.Properties
(,这是一个Map<String, Object>
“本身”)。
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.my</groupId>
<artifactId>spring-xml-config-with-yaml</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.7</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.28</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
</project>
(src/main/resources/)application.yaml:
与OP相同!
src/main/resources/applicationContext.xml(简化):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
<property name="resources" value="classpath:application.yaml"/>
</bean>
</beans>
然后只是一个测试(主要):
package org.my.springxmlconfig;
import java.util.Properties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringXmlConfigMain {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Properties propsBean = context.getBean("yamlProperties", Properties.class);
System.err.println(propsBean);
}
}
打印(未格式化):
{
vtp.config.priority[3].country=IN,
vtp.config.priority[4].countryFriend[0]=NL,
vtp.config.priority[2].countryFriend[1]=AG,
vtp.config.priority[2].countryFriend[0]=UK,
vtp.config.priority[5].countryFriend[0]=DN,
vtp.config.priority[2].country=US,
vtp.config.priority[4].country=PO,
vtp.config.priority[5].country=KN,
vtp.config.priority[3].countryFriend[0]=UK,
vtp.config.priority[3].countryFriend[1]=AG
}
在《普通的spring使用》中,我们可以引用它们:
@Autowired
@Qualifier("yamlProperties")// we need qualifier already due to "systemProperties"
java.util.Properties yamlProps;
当然,这个解决方案不像 spring-boot 那样优雅,但它正确地描述了 yaml 结构。 生成的 map 是“平面”的,但结构是通过(更分层的)“键”实现的。
为了实现“更加分层”的 map ,我会:
- 尝试修改/扩展现有的 factory ( + processor ;(;(
- think about "booting" ! (至少“第一步”听起来成本并不高,也不是很危险)
- (尝试实现“自定义转换器”,:)我终于找到:
YamlMapFactoryBean
!!
编辑!:
将其添加到我们的配置 xml 中:
<bean id="yamlMap" class="org.springframework.beans.factory.config.YamlMapFactoryBean">
<property name="resources" value="classpath:application.yaml"/>
</bean>
这样做:
import org.apache.commons.collections4.MapUtils;
// ...
Map<String, Object> mapBean = context.getBean("yamlMap", Map.class);
MapUtils.debugPrint(System.err, "yamlMap", mapBean);
(仅用于(快速)调试(漂亮)打印,)我们添加以下内容:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version> <!-- resp. latest -->
</dependency>
..然后控制台也打印(格式化):
yamlMap =
{
vtp =
{
config =
{
priority =
{
[2] =
{
country = US java.lang.String
countryFriend = [UK, AG] java.util.ArrayList
} java.util.LinkedHashMap
[3] =
{
country = IN java.lang.String
countryFriend = [UK, AG] java.util.ArrayList
} java.util.LinkedHashMap
[4] =
{
country = PO java.lang.String
countryFriend = [NL] java.util.ArrayList
} java.util.LinkedHashMap
[5] =
{
country = KN java.lang.String
countryFriend = [DN] java.util.ArrayList
} java.util.LinkedHashMap
} java.util.LinkedHashMap
} java.util.LinkedHashMap
} java.util.LinkedHashMap
} java.util.LinkedHashMap
感谢:Multi-line pretty-printing of (nested) collections in Java
关于java - 如何读取Spring XML配置中的application.yml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73784166/