Java读取YML文件时对象为空,请求技术协助
问题分析与解决方案
核心问题
你当前的代码存在两个关键错误:
- 明明指定了
ApplicationProperties作为反序列化目标,却将结果强制转为HashMap,导致实体类的属性绑定逻辑完全失效 - 实体类
ApplicationProperties的结构大概率和YAML文件的层级不匹配
步骤1:定义匹配YAML结构的实体类
根据你的YAML内容,实体类需要对应根节点dmsMapping的层级,示例如下:
import com.fasterxml.jackson.annotation.JsonProperty; public class ApplicationProperties { private DmsMapping dmsMapping; // 内部类对应dmsMapping节点下的属性 public static class DmsMapping { @JsonProperty("input_layer_name") private String inputLayerName; @JsonProperty("output_Layer_volatile") private String outputLayerVolatile; @JsonProperty("output_layer_IML") private String outputLayerIML; // 手动生成getter/setter,或用Lombok的@Data注解简化 public String getInputLayerName() { return inputLayerName; } public void setInputLayerName(String inputLayerName) { this.inputLayerName = inputLayerName; } public String getOutputLayerVolatile() { return outputLayerVolatile; } public void setOutputLayerVolatile(String outputLayerVolatile) { this.outputLayerVolatile = outputLayerVolatile; } public String getOutputLayerIML() { return outputLayerIML; } public void setOutputLayerIML(String outputLayerIML) { this.outputLayerIML = outputLayerIML; } } public DmsMapping getDmsMapping() { return dmsMapping; } public void setDmsMapping(DmsMapping dmsMapping) { this.dmsMapping = dmsMapping; } }
说明:如果不想用
@JsonProperty,可以把实体类字段名改成和YAML键完全一致(包括下划线、大小写),或者配置YAML解析器的命名策略为下划线转驼峰。
步骤2:修正读取代码逻辑
直接将YAML加载结果转为ApplicationProperties,同时用try-with-resources自动管理流资源:
try (InputStream inputStream = LoadExternalConfiguration.class.getClassLoader() .getResourceAsStream("application.yml")) { Yaml yaml = new Yaml(new Constructor(ApplicationProperties.class)); ApplicationProperties properties = yaml.load(inputStream); // 验证读取结果 System.out.println(properties.getDmsMapping().getInputLayerName()); System.out.println(properties.getDmsMapping().getOutputLayerVolatile()); System.out.println(properties.getDmsMapping().getOutputLayerIML()); } catch (IOException e) { e.printStackTrace(); }
额外检查项
- 确保
application.yml放在项目的src/main/resources目录下(Maven/Gradle项目),保证类加载器能找到该文件 - 确认依赖的SnakeYAML版本正确,避免因版本兼容问题导致解析失败
内容的提问来源于stack exchange,提问作者dhananjay_shingote
相关产品推荐
相关产品推荐

