java - 如何读取Spring XML配置中的application.yml?

标签 java spring yaml

在我的项目中,我使用基于 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 ,我会:


编辑!:

将其添加到我们的配置 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/

相关文章:

java - 启动画面错误

java - 在 Maven 中配置 JUnit 目录结构

具有多个 View 解析器的 Spring MVC

rust - 在 Rust 中迭代 yaml 数组

spring - application.yml 中的环境变量不适用于以空格开头的默认值

java - 如何使用 Netbeans 打开 C++ 或 Java 项目 S60 第 5 版 SDK 1.0

java - 即使没有事务,在 jboss 中检索到多个数据库的连接时出错

java - 多个泛型 : Best Common superclass

java - 如何在 Intellij Idea-2017.2.5 中更改文件创建评论日期格式?

kubernetes - K8S : convert "kubeadm init" command-line arguments to "--config" YAML