java 解析.yml文件

本文介绍如何使用Java读取并解析YML配置文件,通过递归方法动态获取特定字段的值,并将其存储为Map集合,方便后续操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java解析.yml文件

把yml文件中的datasource里所有字段的放入到一个map集合中
当想要获取数据库的url时,可以直接使用map.get(“url”)获取得到.

*.yml文件

server:
  port: 8090
  context-path: /myService
spring:
  application:
    name: AAService
  datasource:
    url: jdbc:mysql://localhost:3306/bc
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
  jpa:
    show-sql: false
    properties:
      hibernate:
        jdbc:
          batch_size: 100
        order_inserts: true
        order_updates: true
  cloud:
    service-registry:
      auto-registration:
        enabled: false


*.引入pom包

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml -->
		<dependency>
			<groupId>com.fasterxml.jackson.dataformat</groupId>
			<artifactId>jackson-dataformat-yaml</artifactId>
			<version>2.9.5</version>
		</dependency>

****一.测试代码


import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.yaml.snakeyaml.Yaml;




public class Test {


	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Yaml yml = new Yaml();
		//配置文件路径
		String path = Object.class.getResource("/").getPath().substring(1)+ "application.yml";
		InputStream reader = new FileInputStream(new File(path));
		//yml读取配置文件,指定返回类型为Map,Map中value类型为LinkedHashMap
		Map map = yml.loadAs(reader, Map.class);
		/**
		 * eg:获取server中的port    
		 * server:                 
  			 port: 8090
  			 context-path: /myService  
		 */
		Map mapServer = (Map)map.get("server"); 
		String port = mapServer.get("port").toString();
		System.out.println(port);//输出8090
		
		
		
		/**
		 * 但是如果格式是这样的,或者有更深层次的,我们想动态获取datasource的map集合呢?
		 * 我们可以写一个方法,使用递归动态获取map
		 spring:
   		   datasource:
             url: jdbc:mysql://localhost:3306/bc
             username: root
             password: 123456
             driver-class-name: com.mysql.jdbc.Driver
		 */
		
		
		//传入想要得到的字段
		Map datasourceMap = initYml(map,"datasource");
		System.out.println(datasourceMap.get("url"));//jdbc:mysql://localhost:3306/bc
		System.out.println(datasourceMap.get("username"));//root
		System.out.println(datasourceMap.get("password"));//123456
		System.out.println(datasourceMap.get("driver-class-name"));//com.mysql.jdbc.Driver
		
	}
	public static Map initYml(Map map,String str) {
		Map maps = new HashMap();
		Set<Map.Entry<String, Object>> set = map.entrySet();
		for (Map.Entry<String, Object> entry : set) {//遍历map
			
			if (entry.getKey().equals(str))  		//递归结束条件
				return (Map) entry.getValue();
			
			if (entry.getValue() instanceof Map) {   //如果value是Map集合递归
				maps = initYml((Map) entry.getValue(),str);
				if (maps == null)					 //递归的结果如果为空,继续遍历
					continue;
				return maps;						 //不为空返回
			}

		}

		return null;
	}

}

二.优化代码,可在其他类中直接调用

import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.yaml.snakeyaml.Yaml;

public class YmlUtil {

	/**
	 * 获取yml文件中的指定字段,返回一个map
	 * 
	 * @param sourcename
	 * @return
	 */
	public static Map<String, Object> getResMap(String sourcename) {
		return YmlInit.getMapByName(YmlInit.ymlMap, sourcename);
	}

	// 配置文件仅需要读取一次,读取配置文件的同时把数据保存到map中,map定义为final,仅可以被赋值一次
	private static class YmlInit {
		//初始化文件得到的map
		private static final Map<String, Object> ymlMap = getYml();

		// 读取配置文件,并初始化ymlMap
		private static Map<String, Object> getYml() {
			Yaml yml = new Yaml();
			String path = Object.class.getResource("/").getPath().substring(1) + "application.yml";
			Reader reader = null;
			try {
				reader = new FileReader(new File(path));
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
			return yml.loadAs(reader, Map.class);
		}

		// //传入想要得到的字段
		private static Map<String, Object> getMapByName(Map<String, Object> map, String name) {
			Map<String, Object> maps = new HashMap<String, Object>();
			Set<Map.Entry<String, Object>> set = map.entrySet();
			for (Map.Entry<String, Object> entry : set) {// 遍历map
				Object obj = entry.getValue();
				if (entry.getKey().equals(name))      // 递归结束条件
					return (Map<String, Object>) obj;
				
				if (entry.getValue() instanceof Map) {//如果value是Map集合递归
					maps = getMapByName((Map<String, Object>) obj, name);
					if (maps == null)				   //递归的结果如果为空,继续遍历
						continue;
					return maps;					  //不为空返回
				}
			}
			return null;
		}
	}

}

膜拜大佬,写的不好勿喷~
### Java 项目中缺少 `.yml` 文件的解决方案 在开发基于 Spring Boot 的 Java 项目时,如果发现 `application.yml` 或其他 `.yml` 配置文件未被正确加载或识别,通常会涉及以下几个方面的问题及其对应的解决办法。 #### 1. **IDEA 中 Maven 包缺失** 部分开发者在使用 IDEA 创建 Spring Initializr 项目后,可能会遇到 External Libraries 缺少相关 Maven 包的情况。即使右侧 Maven 工具窗口显示了这些依赖项,重新导入(Reimport)也无法解决问题[^3]。 此时可以通过以下方式尝试修复: - 手动删除项目的 `.idea` 和 `target` 文件夹。 - 清理并重建项目:执行命令 `mvn clean install` 来强制刷新本地仓库中的依赖关系。 - 如果仍然无效,则检查网络环境是否阻止了某些外部资源的访问。 #### 2. **配置文件路径错误** Spring Boot 默认会在类路径下的根目录查找名为 `application.properties` 或者 `application.yml` 的全局设置文档作为启动参数源之一。但如果自定义命名或者放置位置不当的话就会造成读取失败现象发生。因此要确保该文件位于 src/main/resources 下面,并且名称保持一致即 application 开头加上对应扩展名(.properties|.yaml)[^1]. 另外需要注意大小写敏感度问题,在Linux系统环境下尤其重要因为它是区分字母大小写的;而在Windows操作系统里则相对宽松些不过为了兼容多平台建议还是遵循标准书写习惯比较好。 #### 3. **引入 Bootstrap 支持** 当需要额外支持 bootstrap.yml 这样的早期初始化配置文件时(比如用于服务注册中心地址等),就需要显式声明 spring-cloud-starter-bootstrap 组件来激活这一特性[^5]: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>3.1.1</version> </dependency> ``` 安装好上述插件之后就能让框架自动探测到此类特殊用途的设定档从而完成相应功能启用过程而无需再手动指定其所在之处啦! #### 4. **编码格式冲突** 有时由于文本编辑器保存模式不同而导致实际内容虽然看起来没错但实际上却包含了不可见字符或者是BOM(Byte Order Mark)标记之类的干扰因素存在其中进而影响解析引擎正常工作流程。所以最好确认一下所使用的工具选项里面有没有勾选去除多余空白符之类的功能开关哦~ --- ### 示例代码片段 以下是通过 @CrossOrigin 注解实现跨域请求的一个简单例子[^4]: ```java @RestController @RequestMapping("/api") @CrossOrigin(origins = "*") //允许任何域名发起请求 public class ExampleController { @GetMapping("/hello") public String sayHello() { return "Hello from backend!"; } } ``` 此段程序展示了如何利用注释简化 CORS (Cross-Origin Resource Sharing) 设置操作步骤以便于前后端分离架构下更方便快捷地构建 RESTful API 接口服务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值